C++ 双指针算法实战:有效三角形个数与和为 S 的两个数字

1. 有效三角形个数
1.1 题目链接
题目链接
1.2 题目描述

1.3 题目示例

1.4 算法思路
- 构成三角形的条件是两边之和大于第三边,两边之差小于第三边。在排序后的数组中,只需满足
a + b > c(其中 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],说明两边之和太小,将 left 右移来增大和。
1.5 核心代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace 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;
}
};