Largest lexicographic triplet from a given Array that forms a triangle
Given an array arr[], the task is to find the lexicographically largest triplet in that array that can form a triangle. If no such triplet exists, print -1.
Example:
Input: arr[] = { 4, 2, 10, 3, 5 }
Output: 3 4 5
Explanation:
The lexicographically largest triplet is (4, 5, 10). But it does not form a triangle.
The next lexicographically largest triplet is (3, 4, 5).
Since it forms a triangle, it is the required answer.
Input: arr[] = { 20, 12, 120, 3, 15 }
Output: 12 15 20
Approach:
A triplet can form a triangle if and only if it follows the condition given below:
If A, B and C forms a triplet, then the triplet can form a triangle if
A < B + C or B < A + C or C < A + B
The idea is to use Sorting. Sort the array in ascending order. Start traversing from the end of the array and check if any triplet satisfies the above condition. Print the first triplet to satisfy the condition, as the output. If no such triplet can be found, then print -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findTriplet( int arr[], int N)
{
sort(arr, arr + N);
int flag = 0, i;
for (i = N - 1; i - 2 >= 0; i--) {
if (arr[i - 2] + arr[i - 1] > arr[i]) {
flag = 1;
break ;
}
}
if (flag) {
cout << arr[i - 2] << " "
<< arr[i - 1] << " "
<< arr[i] << endl;
}
else {
cout << -1 << endl;
}
}
int main()
{
int arr[] = { 4, 2, 10, 3, 5 };
int N = sizeof (arr) / sizeof (arr[0]);
findTriplet(arr, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void findTriplet( int arr[], int N)
{
Arrays.sort(arr);
int flag = 0 , i;
for (i = N - 1 ; i - 2 >= 0 ; i--)
{
if (arr[i - 2 ] + arr[i - 1 ] > arr[i])
{
flag = 1 ;
break ;
}
}
if (flag != 0 )
{
System.out.println(arr[i - 2 ] + " " +
arr[i - 1 ] + " " +
arr[i] );
}
else
{
System.out.println(- 1 );
}
}
public static void main (String []args)
{
int arr[] = { 4 , 2 , 10 , 3 , 5 };
int N = arr.length;
findTriplet(arr, N);
}
}
|
Python3
def findTriplet(arr, N):
arr.sort()
i = N - 1
while i - 2 > = 0 :
if (arr[i - 2 ] + arr[i - 1 ] > arr[i]):
flag = 1
break
i - = 1
if (flag):
print (arr[i - 2 ],
arr[i - 1 ],
arr[i])
else :
print ( - 1 )
if __name__ = = '__main__' :
arr = [ 4 , 2 , 10 , 3 , 5 ]
N = len (arr)
findTriplet(arr, N)
|
C#
using System;
class GFG{
static void findTriplet( int []arr, int N)
{
Array.Sort(arr);
int flag = 0, i;
for (i = N - 1; i - 2 >= 0; i--)
{
if (arr[i - 2] + arr[i - 1] > arr[i])
{
flag = 1;
break ;
}
}
if (flag != 0)
{
Console.Write(arr[i - 2] + " " +
arr[i - 1] + " " +
arr[i] );
}
else
{
Console.Write(-1);
}
}
public static void Main ( string []args)
{
int []arr = { 4, 2, 10, 3, 5 };
int N = arr.Length;
findTriplet(arr, N);
}
}
|
Javascript
<script>
function findTriplet(arr, N) {
arr.sort((a, b) => a - b);
var flag = 0,
i;
for (i = N - 1; i - 2 >= 0; i--) {
if (arr[i - 2] + arr[i - 1] > arr[i]) {
flag = 1;
break ;
}
}
if (flag) {
document.write(
arr[i - 2] +
" " +
arr[i - 1] +
" " +
arr[i] +
"<br>"
);
}
else {
document.write(-1 + "<br>" );
}
}
var arr = [4, 2, 10, 3, 5];
var N = arr.length;
findTriplet(arr, N);
</script>
|
Time Complexity: O(N*log(N))
Auxiliary Space: O(1)
Last Updated :
01 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...