题目
给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?
样例
例如,给定数组 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)}
思路
(原理:三角形两边之和大于第三边,一种思路是暴力循环三次,这里作不讨论)
1. 先对数组进行排序
2. 从数组下标为2的数开始,取为key值,对小于key值的数进行遍历
3. 遍历:分别从0(begin)和key值下标i-1(end)的位置取值,判断S[begin] + S[end]之和是否大于key值。
4. 若大于,则存在{S[begin],S[end],key}这样的三角形,且下标begin~end之间的数均符合:三角形两边之和大于第三边,即存在(end - begin)个,同时end-1,跳回第三步,继续执行,直到begin>=end
5. 若S[begin] + S[end]之和小于等于key值,则不符合三角形两边之和大于第三边,需要增加S[beging]值,所以begin+1,跳回第三步,直到begin>=end
代码
public class Solution {
public int triangleCount(int[] S) {
Arrays.sort(S);
int count = 0;
for (int i = 2; i < S.length; i++) {
int begin = 0;
int end = i - 1;
int key = S[i];
while (begin < end) {
if (S[begin] + S[end] > key) {
count += end - begin;
end--;
} else {
begin++;
}
}
}
return count;
}
}