976. 三角形的最大周長
阿新 • • 發佈:2020-08-12
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 namespacestd; 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