
双指针应用场景
1. 有效三角形个数
1.1 题目链接
题目链接直达
1.2 题目描述

1.3 题目示例

1.4 算法思路
- 我们首先得清楚构成三角形的条件:两边之和大于第三边,两边之差小于第三边。但是在排序后,只需要满足
a + b > c 就能构成一个有效的三角形。
- 在排序后的数组中,固定最大的边
nums[k] 作为三角形的第三边,然后在 [0, k-1] 范围内使用对撞指针寻找满足条件的两边。
- 具体来说,设置
left = 0 和 right = k-1。当 nums[left] + nums[right] > nums[k] 时,由于数组是升序排列,left 到 right-1 的所有位置与当前 right 组成的配对都能满足条件。这时我们可以直接给计数器增加 right - left 个有效组合,然后将 right 左移一位。
- 如果
nums[left] + nums[right] <= nums[k],说明当前的两边之和太小,需要增大其中一边。由于 right 已经是当前范围内较大的值,我们通过将 left 右移来增加两边之和。
1.5 核心代码
#include <iostream>
#include <vector>
#include <algorithm>
using std;
{
:
{
(nums.(), nums.());
n = nums.();
ret = ;
( i = n - ; i >= ; i--)
{
left = , right = i - ;
(left < right) {
(nums[left] + nums[right] > nums[i]) {
ret += right - left;
right--;
} {
left++;
}
}
}
ret;
}
};