阵列中的最大周长三角形

给定一个非负整数数组。从该数组中找出三个元素,它们形成最大周长的三角形。

例子:  

输入: {6, 1, 6, 5, 8, 4}
输出: 20
输入: {2, 20, 7, 55, 1, 33, 12, 4}
输出:不可能形成三角形。
输入: {33, 6, 20, 1, 8, 12, 5, 55, 4, 9}
输出: 41

蛮力解决方案是:检查 3 个元素的所有组合,是否形成三角形,如果形成三角形,则更新最大周长。
这个解决方案的复杂度是 O(n 3 )。

下面是它的代码:

Java

// 利用给定数组的元素求出可组成的最大周长三角形的强制解法
import java.io.*;

class GFG {

    
// Function to find out maximum perimeter
    static void maxPerimeter(int arr[], int n)
    {
    
        
// initialize maximum perimeter as 0.
        int maxi = 0;
    
        
//从数组中拾取 3 个不同的元素
  
        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++) 
                {
    
                    
// a, b, c are 3 sides of
                    
// the triangle
                    int a = arr[i];
                    int b = arr[j];
                    int c = arr[k];
    
                    
// 检查 a, b, c 
          
// 是否构成三角形。
                    if (a < b+c && b < c+a && c < a+b)
                    {
    
                        
// if it forms a triangle
                        
// then update the maximum 
                        
// value.
                        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." );
    }
    
    
// Driver Program
    public static void main (String[] args)
    {
        
        
// test case 1
        int arr1[] = {6, 1, 6, 5, 8, 4};
        maxPerimeter(arr1, 6);
    
        
// test case 2
        int arr2[] = {2, 20, 7, 55, 1, 33, 12, 4};
        maxPerimeter(arr2, 8);
    
        
// test case 3
        int arr3[] = {33, 6, 20, 1, 8,
                                12, 5, 55, 4, 9};
        maxPerimeter(arr3, 10);
    }
}

Python:

# 强制求解,找出使用给定数组中的元素可以组成的最大周长三角形 
#
# 找出最大周长三角形 的函数
def maxPerimeter(arr):
    maxi = 0
    n = len(arr)
    
    从数组中拾取 3 个不同的 
   元素
    for i in range(n - 2):
        for j in range(i + 1, n - 1):
            for k in range(j + 1, n):
                
                # a, b, c are 3 sides 
                # of the triangle
                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)

# Driver code
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)
    {
    
        
//初始化最大值 
     
//周长为 0。
        int maxi = 0;
    
        
//从数组中拾取 3 个不同的元素
      
// 从数组中拾取 3 个不同的元素。
        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++) 
                {
    
                    
// a, b, c are 3 sides of
                    
// the triangle
                    int a = arr[i];
                    int b = arr[j];
                    int c = arr[k];
    
                    
// check whether a, b, c 
                    
// forms a triangle or not.
                    if (a < b + c && 
                        b < c + a && 
                        c < a + b)
                    {
    
                        
// if it forms a triangle
                        
// then update the maximum 
                        
// value.
                        maxi = Math.Max(maxi, a + b + c);
                    }
                }
            }
        }
    
        
// 如果最大周长为 
     
//非零,则打印出来。
        if (maxi > 0) 
        Console.WriteLine(
"Maximum Perimeter is: "+ maxi);
    
        
// otherwise no triangle 
        
// formation is possible.
        else
        Console.WriteLine(
"Triangle formation "
                        
"is not possible.");
    }
    
    
// Driver Code
    public static void Main ()
    {
        
        
// test case 1
        int []arr1 = {6, 1, 6, 
                    5, 8, 4};
        maxPerimeter(arr1, 6);
    
        
// test case 2
        int []arr2 = {2, 20, 7, 55, 
                    1, 33, 12, 4};
        maxPerimeter(arr2, 8);
    
        
// test case 3
        int []arr3 = {33, 6, 20, 1, 8,
                    12, 5, 55, 4, 9};
        maxPerimeter(arr3, 10);
    }
}

 JavaScript

<script>

// JavaScript 程序查找使用给定数组中的元素 
//可以组成的最大周长三角形;

    
// Function to find out maximum perimeter
    function maxPerimeter(arr, n)
    {
    
        
// initialize maximum perimeter as 0.
        let maxi = 0;
    
        
// pick up 3 different elements
        
// from the array.
        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++) 
                {
    
                    
// a, b, c are 3 sides of
                    
// the triangle
                    let a = arr[i];
                    let b = arr[j];
                    let c = arr[k];
    
                    
// check whether a, b, c 
                    
// forms a triangle or not.
                    if (a < b+c && b < c+a && c < a+b)
                    {
    
                        
// if it forms a triangle
                        
// then update the maximum 
                        
// value.
                        maxi = Math.max(maxi, a+b+c);
                    }
                }
            }
        }
    
        
// If maximum perimeter is non-zero
        
// then print it.
        if (maxi > 0) 
        document.write(
"Maximum Perimeter is: "
                                            + maxi +
"<br/>");
    
        
// otherwise no triangle formation
        
// is possible.
        else
        document.write(
"Triangle formation "
                            +
"is not possible." + "<br/>" );
    }

// Driver code

        
// test case 1
        let arr1 = [6, 1, 6, 5, 8, 4];
        maxPerimeter(arr1, 6);
    
        
// test case 2
        let arr2 = [2, 20, 7, 55, 1, 33, 12, 4];
        maxPerimeter(arr2, 8);
    
        
// test case 3
        let arr3 = [33, 6, 20, 1, 8,
                                12, 5, 55, 4, 9];
        maxPerimeter(arr3, 10);


</script>