- 题目链接
- 优化:对整个数组排序,可以简化比较模型,减少比较次数
- 在有序的情况下,只需较⼩的两条边之和⼤于第三边即可
- 设最⻓边枚举到
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;
}