题目
- 三角形的最大周长
给定由一些正数(代表长度)组成的数组 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
题解
方法一:最大遍历法
思路:先对数组进行升序排序,然后从尾部开始遍历,若能够组成三角形,则返回此时三边之和。
class Solution {
public int largestPerimeter(int[] A) {
// 先进行升序排序
Arrays.sort(A);
// 从尾部开始遍历(从最大开始遍历,如可以组成三角形直接返回三边长度之和)
int i = A.length - 1;
// 结束条件,若三边最小都组不成三角形,返回0
while(i >= 2){
// 三角形的判断条件,三边中两个最小边的和大于第三边,两个最大边的差大于第三边
if((A[i - 2] + A[i - 1]) > A[i] && (A[i] - A[i - 1]) < A[i -2]){
// 如可以形成三角形,说明此时周长最大,返回三边之和
return A[i - 2] + A[i - 1] + A[i];
}else{
i--;
}
}
return 0;
}
}
通过详情:
复杂度分析:
时间复杂度:O(N),最差到达数组头部时组成最小三角形,此时时间复杂度为O(n)
空间复杂度:O(1),无额外空间使用。
纠错:
因为Arrays数组排序需要时间和空间,且时间复杂度为O(NlogN),空间复杂度为O(logN),所以本题复杂度应为此。(狗头保命)
注: 为什么选择排序后相邻的三边,因为若相邻的三边都组不成三角形,则之后的更加不会组成三角形,并且需要选择最大周长
为什么排序遍历相邻元素可行,有没有可能最优解为非相邻元素?(不会)
证明:反证 假设 a , b, c 为最优解,且存在a’,b’,满足 a < a’ < b < b’ < c(存在非相邻元素)
由于 a + b > c,a < a’, 有 a’ + b > c,(a’, b, c)优于(a, b, c),与(a, b, c)为最优解矛盾,故不存在a’
b’同理不存在 由于 a + b > c, b < b’,有a + b’ > c,(a, b, c)为最优解矛盾,故不存在b’
因此最优解一定为排序后相邻元素