前言
给定由一些正数(代表长度)组成的数组
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。