Given an array of non-negative integers. Find out three elements from this array that form a triangle of the maximum perimeter.
Examples:
Input : {6, 1, 6, 5, 8, 4}
Output : 20
Input : {2, 20, 7, 55, 1, 33, 12, 4}
Output : Triangle formation is not possible.
Input: {33, 6, 20, 1, 8, 12, 5, 55, 4, 9}
Output: 41
Naive Solution: The brute force solution is: check for all combinations of 3 elements, whether it forms a triangle or not, and update the maximum perimeter if it forms a triangle. The complexity of the naive solution is O(n3). Below is the code for it.
Implementation:
C++
#include <iostream>
#include <algorithm>
using namespace std;
void maxPerimeter( int arr[], int n){
int maxi = 0;
for ( int i = 0; i < n - 2; i++){
for ( int j = i + 1; j < n - 1; j++){
for ( int k = j + 1; k < n; k++){
int a = arr[i];
int b = arr[j];
int c = arr[k];
if (a < b+c && b < c+a && c < a+b){
maxi = max(maxi, a+b+c);
}
}
}
}
if (maxi) cout << "Maximum Perimeter is: "
<< maxi << endl;
else cout << "Triangle formation "
<< "is not possible." << endl;
}
int main()
{
int arr1[6] = {6, 1, 6, 5, 8, 4};
maxPerimeter(arr1, 6);
int arr2[8] = {2, 20, 7, 55, 1,
33, 12, 4};
maxPerimeter(arr2, 8);
int arr3[10] = {33, 6, 20, 1, 8,
12, 5, 55, 4, 9};
maxPerimeter(arr3, 10);
return 0;
}
|
Java
import java.io.*;
class GFG {
static void maxPerimeter( int arr[], int n)
{
int maxi = 0 ;
for ( int i = 0 ; i < n - 2 ; i++)
{
for ( int j = i + 1 ; j < n - 1 ; j++)
{
for ( int k = j + 1 ; k < n; k++)
{
int a = arr[i];
int b = arr[j];
int c = arr[k];
if (a < b+c && b < c+a && c < a+b)
{
maxi = Math.max(maxi, a+b+c);
}
}
}
}
if (maxi > 0 )
System.out.println( "Maximum Perimeter is: "
+ maxi);
else
System.out.println( "Triangle formation "
+ "is not possible." );
}
public static void main (String[] args)
{
int arr1[] = { 6 , 1 , 6 , 5 , 8 , 4 };
maxPerimeter(arr1, 6 );
int arr2[] = { 2 , 20 , 7 , 55 , 1 , 33 , 12 , 4 };
maxPerimeter(arr2, 8 );
int arr3[] = { 33 , 6 , 20 , 1 , 8 ,
12 , 5 , 55 , 4 , 9 };
maxPerimeter(arr3, 10 );
}
}
|
Python
def maxPerimeter(arr):
maxi = 0
n = len (arr)
for i in range (n - 2 ):
for j in range (i + 1 , n - 1 ):
for k in range (j + 1 , n):
a = arr[i]
b = arr[j]
c = arr[k]
if (a < b + c and b < a + c
and c < a + b):
maxi = max (maxi, a + b + c)
if (maxi = = 0 ):
return "Triangle formation is not possible"
else :
return "Maximum Perimeter is: " + str (maxi)
def main():
arr1 = [ 6 , 1 , 6 , 5 , 8 , 4 ]
a = maxPerimeter(arr1)
print (a)
arr2 = [ 2 , 20 , 7 , 55 ,
1 , 33 , 12 , 4 ]
a = maxPerimeter(arr2)
print (a)
arr3 = [ 33 , 6 , 20 , 1 , 8 ,
12 , 5 , 55 , 4 , 9 ]
a = maxPerimeter(arr3)
print (a)
if __name__ = = '__main__' :
main()
|
C#
using System;
class GFG
{
static void maxPerimeter( int []arr,
int n)
{
int maxi = 0;
for ( int i = 0; i < n - 2; i++)
{
for ( int j = i + 1; j < n - 1; j++)
{
for ( int k = j + 1; k < n; k++)
{
int a = arr[i];
int b = arr[j];
int c = arr[k];
if (a < b + c &&
b < c + a &&
c < a + b)
{
maxi = Math.Max(maxi, a + b + c);
}
}
}
}
if (maxi > 0)
Console.WriteLine( "Maximum Perimeter is: " + maxi);
else
Console.WriteLine( "Triangle formation " +
"is not possible." );
}
public static void Main ()
{
int []arr1 = {6, 1, 6,
5, 8, 4};
maxPerimeter(arr1, 6);
int []arr2 = {2, 20, 7, 55,
1, 33, 12, 4};
maxPerimeter(arr2, 8);
int []arr3 = {33, 6, 20, 1, 8,
12, 5, 55, 4, 9};
maxPerimeter(arr3, 10);
}
}
|
PHP
<?php
function maxPerimeter( $arr , $n )
{
$maxi = 0;
for ( $i = 0; $i < $n - 2; $i ++)
{
for ( $j = $i + 1; $j < $n - 1; $j ++)
{
for ( $k = $j + 1; $k < $n ; $k ++)
{
$a = $arr [ $i ];
$b = $arr [ $j ];
$c = $arr [ $k ];
if ( $a < $b + $c and
$b < $c + $a and
$c < $a + $b )
{
$maxi = max( $maxi , $a + $b + $c );
}
}
}
}
if ( $maxi )
{
echo "Maximum Perimeter is: " ;
echo $maxi , "\n" ;
}
else
{
echo "Triangle formation " ;
echo "is not possible. \n" ;
}
}
$arr1 = array (6, 1, 6, 5, 8, 4);
maxPerimeter( $arr1 , 6);
$arr2 = array (2, 20, 7, 55,
1, 33, 12, 4);
maxPerimeter( $arr2 , 8);
$arr3 = array (33, 6, 20, 1, 8,
12, 5, 55, 4, 9);
maxPerimeter( $arr3 , 10);
?>
|
Javascript
<script>
function maxPerimeter(arr, n)
{
let maxi = 0;
for (let i = 0; i < n - 2; i++)
{
for (let j = i + 1; j < n - 1; j++)
{
for (let k = j + 1; k < n; k++)
{
let a = arr[i];
let b = arr[j];
let c = arr[k];
if (a < b+c && b < c+a && c < a+b)
{
maxi = Math.max(maxi, a+b+c);
}
}
}
}
if (maxi > 0)
document.write( "Maximum Perimeter is: "
+ maxi + "<br/>" );
else
document.write( "Triangle formation "
+ "is not possible." + "<br/>" );
}
let arr1 = [6, 1, 6, 5, 8, 4];
maxPerimeter(arr1, 6);
let arr2 = [2, 20, 7, 55, 1, 33, 12, 4];
maxPerimeter(arr2, 8);
let arr3 = [33, 6, 20, 1, 8,
12, 5, 55, 4, 9];
maxPerimeter(arr3, 10);
</script>
|
OutputMaximum Perimeter is: 20
Triangle formation is not possible.
Maximum Perimeter is: 41
Auxiliary Space : O(1)
Efficient Approach:
First, we can sort the array in non-increasing order. So, the first element will be the maximum and the last will be the minimum. Now if the first 3 elements of this sorted array form a triangle, then it will be the maximum perimeter triangle, as for all other combinations the sum of elements(i.e. the perimeter of that triangle) will be = b >= c). a, b,c can not form a triangle, so a >= b + c. As, b and c = c+d (if we drop b and take d) or a >= b+d (if we drop c and take d). So, we have to drop a and pick up d.
Again, the same set of analysis for b, c, and d. We can continue this till end and whenever we find a triangle forming a triple, then we can stop checking, as this triple gives a maximum perimeter.
Hence, if arr[i] < arr[i+1] + arr[i+2] (0 <= i <= n-3)in the sorted array, then arr[i], arr[i+1] and arr[i+2] form a triangle.
Below is the simple implementation of this concept:
C++
#include <iostream>
#include <algorithm>
using namespace std;
void maxPerimeter( int arr[], int n){
sort(arr, arr+n, greater< int >());
int maxi = 0;
for ( int i = 0; i < n-2; i++){
if (arr[i] < arr[i+1] + arr[i+2]){
maxi = max(maxi, arr[i] + arr[i+1] + arr[i+2]);
break ;
}
}
if (maxi)
cout << "Maximum Perimeter is: "
<< maxi << endl;
else
cout << "Triangle formation"
<< "is not possible." << endl;
}
int main()
{
int arr1[6] = {6, 1, 6, 5, 8, 4};
maxPerimeter(arr1, 6);
int arr2[8] = {2, 20, 7, 55, 1,
33, 12, 4};
maxPerimeter(arr2, 8);
int arr3[10] = {33, 6, 20, 1, 8,
12, 5, 55, 4, 9};
maxPerimeter(arr3, 10);
return 0;
}
|
Java
import java.util.Arrays;
class GFG {
static void maxPerimeter( int arr[], int n) {
arr = arrRevSort(arr);
int maxi = 0 ;
for ( int i = 0 ; i < n - 2 ; i++) {
if (arr[i] < arr[i + 1 ] + arr[i + 2 ]) {
maxi = Math.max(maxi, arr[i] + arr[i + 1 ] + arr[i + 2 ]);
break ;
}
}
if (maxi > 0 ) {
System.out.println( "Maximum Perimeter is: " + maxi);
}
else {
System.out.println( "Triangle formation is not possible." );
}
}
static int [] arrRevSort( int [] arr) {
Arrays.sort(arr, 0 , arr.length);
int j = arr.length - 1 ;
for ( int i = 0 ; i < arr.length / 2 ; i++, j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
}
public static void main(String[] args) {
int arr1[] = { 6 , 1 , 6 , 5 , 8 , 4 };
maxPerimeter(arr1, 6 );
int arr2[] = { 2 , 20 , 7 , 55 , 1 , 33 , 12 , 4 };
maxPerimeter(arr2, 8 );
int arr3[] = { 33 , 6 , 20 , 1 , 8 , 12 , 5 , 55 , 4 , 9 };
maxPerimeter(arr3, 10 );
}
}
|
Python3
def maxPerimeter(arr):
maxi = 0
n = len (arr)
arr.sort(reverse = True )
for i in range ( 0 , n - 2 ):
if arr[i] < (arr[i + 1 ] + arr[i + 2 ]):
maxi = max (maxi, arr[i] +
arr[i + 1 ] + arr[i + 2 ])
break
if (maxi = = 0 ):
return "Triangle formation is not possible"
else :
return "Maximum Perimeter is: " + str (maxi)
def main():
arr1 = [ 6 , 1 , 6 , 5 , 8 , 4 ]
a = maxPerimeter(arr1)
print (a)
arr2 = [ 2 , 20 , 7 , 55 ,
1 , 33 , 12 , 4 ]
a = maxPerimeter(arr2)
print (a)
arr3 = [ 33 , 6 , 20 , 1 , 8 ,
12 , 5 , 55 , 4 , 9 ]
a = maxPerimeter(arr3)
print (a)
if __name__ = = '__main__' :
main()
|
C#
using System;
class GFG {
static void maxPerimeter( int [] arr, int n) {
arr = arrRevSort(arr);
int maxi = 0;
for ( int i = 0; i < n - 2; i++) {
if (arr[i] < arr[i + 1] + arr[i + 2]) {
maxi = Math.Max(maxi, arr[i] + arr[i + 1] + arr[i + 2]);
break ;
}
}
if (maxi > 0) {
Console.WriteLine( "Maximum Perimeter is: " + maxi);
}
else {
Console.WriteLine( "Triangle formation is not possible." );
}
}
static int [] arrRevSort( int [] arr) {
Array.Sort(arr);
int j = arr.Length - 1;
for ( int i = 0; i < arr.Length / 2; i++, j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
}
public static void Main() {
int [] arr1 = {6, 1, 6, 5, 8, 4};
maxPerimeter(arr1, 6);
int [] arr2 = {2, 20, 7, 55, 1, 33, 12, 4};
maxPerimeter(arr2, 8);
int [] arr3 = {33, 6, 20, 1, 8, 12, 5, 55, 4, 9};
maxPerimeter(arr3, 10);
}
}
|
PHP
<?php
function maxPerimeter(& $arr , $n )
{
rsort( $arr );
$maxi = 0;
for ( $i = 0; $i < $n - 2; $i ++)
{
if ( $arr [ $i ] < $arr [ $i + 1] +
$arr [ $i + 2])
{
$maxi = max( $maxi , $arr [ $i ] +
$arr [ $i + 1] +
$arr [ $i + 2]);
break ;
}
}
if ( $maxi )
{
echo ( "Maximum Perimeter is: " );
echo ( $maxi ) ;
echo ( "\n" );
}
else
{
echo ( "Triangle formation " );
echo ( "is not possible." );
echo ( "\n" );
}
}
$arr1 = array (6, 1, 6, 5, 8, 4);
$s = sizeof( $arr1 );
maxPerimeter( $arr1 , $s );
$arr2 = array (2, 20, 7, 55, 1,33, 12, 4);
$st = sizeof( $arr2 );
maxPerimeter( $arr2 , $st );
$arr3 = array (33, 6, 20, 1, 8,
12, 5, 55, 4, 9);
$st1 = sizeof( $arr3 );
maxPerimeter( $arr3 , $st1 );
?>
|
Javascript
<script>
function maxPerimeter(arr, n){
arr.sort( function (a, b){ return a - b});
arr.reverse();
let maxi = 0;
for (let i = 0; i < n-2; i++){
if (arr[i] < arr[i+1] + arr[i+2]){
maxi = Math.max(maxi, arr[i] + arr[i+1] + arr[i+2]);
break ;
}
}
if (maxi)
document.write( "Maximum Perimeter is: " + maxi + "</br>" );
else
document.write( "Triangle formation is not possible." + "</br>" );
}
let arr1 = [6, 1, 6, 5, 8, 4];
maxPerimeter(arr1, 6);
let arr2 = [2, 20, 7, 55, 1, 33, 12, 4];
maxPerimeter(arr2, 8);
let arr3 = [33, 6, 20, 1, 8, 12, 5, 55, 4, 9];
maxPerimeter(arr3, 10);
</script>
|
OutputMaximum Perimeter is: 20
Triangle formationis not possible.
Maximum Perimeter is: 41
Complexity Analysis:
- Time complexity: O(n*log(n)). This much time is required to sort the array.
- Space complexity: O(1) since constant space is used.