共计 772 个字符,预计需要花费 2 分钟才能阅读完成。
前言
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;
}