前言
給定由一些正數(代表長度)組成的陣列
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
解題思路
本題可以拆成兩個問題去分析:
- 三條邊能否構成三角形
- 找出構成的三角形中周長最大的三角形
問題1可以利用三角形的特性:三角形的兩邊之和大於第三邊,即已知存在一個三角形,三條邊分別為a
、b
、c
,則同時滿足a+b>c
、a+c>b
和b+c>a
。
而問題只是一個簡單的判斷邏輯,並不複雜。這裡可以結合問題1中三角形的特性來優化判斷邏輯,詳細內容請看實現程式碼
實現程式碼
/**
* 976. 三角形的最大周長
* 判斷能否組成三角形的方法是兩邊之後要大於第三邊
* @param A
* @return
*/
public int largestPerimeter(int[] A) {
int result=0;
//陣列進行排序(從小到大)
Arrays.sort(A);
//倒序訪問陣列,取出三個數字嘗試構建三角形
for(int i=A.length-1;i>=0;i--){
if(i-2>=0){//剩餘可用的邊個數要不小於3個
int a=A[i];
int b=A[i-1];
int c=A[i-2];
//判斷三條邊能否組成三角形,判斷條件為兩之和大於第三邊
if(a+b>c && a+c>b && b+c>a){
result=a+b+c;//直接找到能夠構成最大周長三角形的3條邊,中斷迴圈
break;
}
}else{//剩餘的邊個數不夠中斷迴圈
break;
}
}
return result;
}