# 有效三角形的个数

给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。

输入: [2,2,3,4]
输出: 3
解释:
有效的组合是: 
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
1
2
3
4
5
6
7

# 思路

我们知道三角形的任意两边之和大于第三边,任意两边之差小于第三边,如果这三条边长从小到大为 a 、 b 、 c ,当且仅当 a + b > c 这三条边能组成三角形

img

/**
 * @param {number[]} nums
 * @return {number}
 */
var triangleNumber = function(nums) {
    if(nums.length < 3) return 0
    let count = 0
    nums.sort((a,b) => a-b)
    for(let k=nums.length-1;k>1;k--) {
        let i=0,j=k-1
        while(i < j) {
            if(nums[i]+nums[j] > nums[k]) {
                count+=j-i
                j--
            } else {
                i++
            }
        }
    }
    return count
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21