前言
Weekly Contest 119的 三角形的最大周长:
给定由一些正数(代表长度)组成的数组 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;
}
发表回复