1. 程式人生 > 實用技巧 >976. 三角形的最大周長

976. 三角形的最大周長

976. 三角形的最大周長

給定由一些正數(代表長度)組成的陣列 A,返回由其中三個長度組成的、面積不為零的三角形的最大周長。

如果不能形成任何面積不為零的三角形,返回0。

示例 1:

  輸入:[2,1,2]
  輸出:5
示例 2:

輸入:[1,2,1]
輸出:0
示例 3:

輸入:[3,2,3,4]
輸出:10
示例 4:

輸入:[3,6,2,3]
輸出:8

提示:

3 <= A.length <= 10000
1 <= A[i] <= 10^6

方法:排序
思路

不失一般性的,我們假設三角形的邊長滿足 a \leq b \leq ca≤b≤c。那麼這三條邊組成三角形的面積非零的充分必要條件是 a + b > ca+b>c。

再假設我們已經知道 cc 的長度了,我們沒有理由不從陣列中選擇儘可能大的 aa 與 bb。因為當且僅當 a + b > ca+b>c 的時候,它們才能組成一個三角形。

演算法

基於這種想法,一個簡單的演算法就呼之欲出:排序陣列。對於陣列內任意的 cc,我們選擇滿足條件的最大的 a \leq b \leq ca≤b≤c,也就是大到小排序,位於 cc 後面的兩個元素。 從大到小列舉 cc,如果能組成三角形的話,我們就返回答案。

程式碼:

#include<iostream>
#include<bits/stdc++.h>
using namespace
std; int main(){ int n; cin>>n; int *arr = new int[n+1]; for (int i = 0; i < n; i++) { cin>>arr[i]; } sort(arr,arr+n); for (int i = n-3; i >= 0; i++) { if (arr[i]+arr[i+1]>arr[i+2]) { cout<<arr[i]+arr[i+1
]+arr[i+2]<<endl; return 0; } } }

輸入:

4
3 2 3 4

輸出:

10