给定由一些正数(代表长度)组成的数组 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
通过次数30,487
提交次数51,923
思路:贪心+排序
我们假设三角形的边长满足 ,那么这三条边组成面积不为零的三角形的充分必要条件为
。
基于此,我们可以选择枚举三角形的最长边 ,而从贪心的角度考虑,我们一定是选「小于
的最大的两个数」作为边长
和
,此时最有可能满足
,使得三条边能够组成一个三角形,且此时的三角形的周长是最大的。
因此,我们先对整个数组排序,倒序枚举第个数作为最长边,那么我们只要看其前两个数
和
,判断
是否大于
即可,如果能组成三角形我们就找到了最大周长的三角形,返回答案
即可。如果对于任何数作为最长边都不存在面积不为零的三角形,则返回答案
。
class Solution {
public int largestPerimeter(int[] A){
Arrays.sort(A);
for(int i=A.length-1;i>=2;i--){
if(A[i]<A[i-1]+A[i-2])
return A[i]+A[i-1]+A[i-2];
}
return 0;
}
}