给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?
样例
Example 1:
Input: [3, 4, 6, 7]
Output: 3
Explanation:
They are (3, 4, 6),
(3, 6, 7),
(4, 6, 7)
Example 2:
Input: [4, 4, 4, 4]
Output: 4
Explanation:
Any three numbers can form a triangle.
So the answer is C(3, 4) = 4
解题思路:
一开始想采用DFS,发现太复杂了,没必要。采用双指针法,时间复杂度O(N^2)。
for 循环最大边的位置 i,接下来的任务就是在 0~i-1 之间找到两数之和 > S[i]
三角形的条件是两条最小边之和大于最大边,依据这个性质,我们可以先将数组排序,然后依次遍历,遍历元素看作第三边,在之前加两个指针i-1, 0,看作前两边,只要两边的和大于第三边则表明这两指针之间的数作为最小边也可以是三角形,返回r-l,同时l--,考察稍小的元素,若不满足,则l++,考察最小边稍大的元素。
public class Solution {
/**
* @param S: A list of integers
* @return: An integer
*/
public int triangleCount(int[] S) {
// write your code here
if(S.length < 3)
return 0;
Arrays.sort(S);
int res = 0;
for(int i=2; i<S.length; i++){
int l=0, r=i-1;
while(l < r){
if(S[l] + S[r] > S[i]){
res += r - l;
r--;
}else
l++;
}
}
return res;
}
}