- 题目链接
- 优化:对整个数组排序,可以简化比较模型,减少比较次数
- 在有序的情况下,只需较⼩的两条边之和⼤于第三边即可
- 设最⻓边枚举到
max位置,区间[left, right]是max位置左边的区间(也就是⽐它⼩的区间)
if (nums[left] + nums[right] > nums[max])
- 说明
[left, right - 1]区间上的所有元素均可以与nums[right]构成⽐nums[max]⼤的⼆元组 - 共有
right - left种 - 此时
right位置的元素的所有情况相当于全部考虑完毕,right--,进⼊下⼀轮判断
if (nums[left] + nums[right] <= nums[max])
- 说明
left位置的元素是不可能与[left + 1, right]位置上的元素构成满⾜条件的⼆元组 left位置的元素可以舍去left++进⼊下轮循环

int TriangleNumber(vector<int>& nums)
{
sort(nums.begin(), nums.end());
int count = 0;
for(int max = nums.size() - 1; max >= 2; max--)
{
int left = 0, right = max - 1;
while(left < right)
{
if(nums[left] + nums[right] > nums[max])
{
count += right - left;
right--;
}
else
{
left++;
}
}
}
return count;
}