给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?
样例
例如,给定数组 S = {3,4,6,7},返回 3
其中我们可以找到的三个三角形为:
{3,4,6}
{3,6,7}
{4,6,7}
给定数组 S = {4,4,4,4}, 返回 4
其中我们可以找到的三个三角形为:
{4(1),4(2),4(3)}
{4(1),4(2),4(4)}
{4(1),4(3),4(4)}
{4(2),4(3),4(4)}
思路
基本的三角形性质,两边之和大于第三边。
先把所有数 排序,然后将第一个数a从index为k开始往后枚举,其他两个数b,c在第一个数的左边(即小于a的区域)开始取,b从0开始,c从k-1开始。统计符合要求(b+c>a)的数目。
b和c从a的左边开始取的原因很简单,如果b和c有一个大于a就没必要寻找b + c大于a的位置了
代码
public class Solution {
/*
* @param S: A list of integers
* @return: An integer
*/
public int triangleCount(int[] S) {
int count = 0;
Arrays.sort(S);
for (int i = 2; i < S.length; i++) {
int left = 0;
int right = i - 1;
while (left < right) {
if (S[left] + S[right] > S[i]) {
count += right - left;
right--;
} else {
left++;
}
}
}
return count;
}
}