判断有效三角形的个数
判断有效三角形的个数
基本思想
- 因为判断三边能不能构成三角形,要任意两边都大于第三边,如果不知道边的大小关系则要判断三次。但是如果知道了边的大小关系只需要最大的一个边 小于另外两个边之和就好了。 就只需要判断一次。所以我们应该对数组进行排序!
- 一般的做法是 三层循环暴力枚举,我们发现固定最后一个指针的时候会有意想不到的性质
- 当 a[l] + a[r] > a[i] 时, 因为a[l]在变大所以 l 到 r -1 的位置都满足条件。 有 r - 1 -l +1 = r - l 个 移动 r指针 r–
- 当a[l] + a[r] <= a[i]时,因为不满足条件,我们需要移动l指针,直到满足条件位置
为何这种做法是正确的?
因为我们固定i,然后再固定r ,然后移动 l 本质相当于 普通做法的倒着的枚举!
完整代码
int triangleNumber(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(),nums.end());
int count = 0;
for(int i = n-1; i >= 2; i--)
{
int l = 0;
int r = i - 1;
while( l < r)
{
if(nums[l] + nums[r]> nums[i]){
count += r - l;
r--;
}else{
l++;
}
}
}
return count;
}