Given an array A
of positive lengths, return the largest perimeter of a triangle with non-zero area, formed from 3 of these lengths.
If it is impossible to form any triangle of non-zero area, return 0
.
Example 1:
Input: [2,1,2] Output: 5
Example 2:
Input: [1,2,1] Output: 0
Example 3:
Input: [3,2,3,4] Output: 10
Example 4:
Input: [3,6,2,3] Output: 8
Note:
3 <= A.length <= 10000
1 <= A[i] <= 10^6
题目要求在给定的正数数组中,选出三个数字组成一个周长最大的面积不为零的三角形。若任意三个数字均不能组成三角形,则返回0。
首先明确,组成三角形的充要条件就是,任意两边的和都大于第三边。
其次要做到周长最大的三角形,那就尽可能的挑选数组中最大的几个数字。所以这时需要对数组进行排序。
然后假设选取最大的三个数字a, b, c是否可以呢?(其中a, b, c满足,a <= b <= c)那么这三个数字组成的三角形就要满足上面所说构成三角形的充要条件,经过计算我们发现只需条件 a + b > c 满足即可,因为根据abc自身的大小关系,c + a > b 和 c + b > a 一定成立。
同时我们还可以证明,若abc为满足条件的最大周长三角形,那么在排序后的数组中abc一定是连续的,否则就不是最大的三角形。
最后根据以上分析,我们可以把问题简化为寻找排序后最大的下标为N的数字,且满足A[N - 1] + A[N - 2] > A[N],若倒序查找到N - 2 < 0 时仍无满足条件的下标N,则返回0,否则返回最大的周长。
AC代码:
class Solution {
public int largestPerimeter(int[] A) {
Arrays.sort(A);
for (int i = A.length - 3; i >= 0; --i) {
if (A[i + 2] < A[i + 1] + A[i]) {
return A[i + 2] + A[i + 1] + A[i];
}
}
return 0;
}
}
如有错误,欢迎指摘。也欢迎通过左上角的“向TA提问”按钮问我问题,我将竭力解答你的疑惑。