611. 有效三角形的个数
分析
先将数组排序, 排完序后, 先固定A, B, 然后考虑C
因为三角形需要满足任意两边之和大于第三边
A + B > C, A + C > B 必然满足
所以只需要满足 B + C > A, 即 C > A - B
可以用双指针 扫描到最大的k
, 是的 C > A - B
那么C 可以取的范围是[k, j - 1], 所以有j - 1 - k + 1 = j - k种
code
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int res = 0;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i ++ )
for (int j = i - 1, k = 0; j > 0 && k < j; j -- ) { // 注意是j --
while (k < j && nums[k] <= nums[i] - nums[j]) k ++ ;
res += j - k;
}
return res;
}
};