C++ 双指针实战:有效三角形个数与和为 S 的两个数字
双指针是处理数组类问题的利器,尤其在有序数组中,利用单调性可以大幅降低时间复杂度。本文将通过两个经典题目——「有效三角形个数」和「和为 S 的两个数字」,深入剖析对撞指针的应用逻辑。
1. 有效三角形个数
1.1 题目描述
给定一个包含非负整数的数组 nums,返回其中能组成三角形的三元组个数。
1.2 思路分析
构成三角形的条件是任意两边之和大于第三边。对于三个数 a, b, c(假设已排序 a <= b <= c),只需满足 a + b > c 即可。
算法核心步骤如下:
- 排序:首先将数组升序排列。
- 固定最长边:从后往前遍历,固定最大的边
nums[k]。 - 双指针查找:在
[0, k-1]区间内使用左右指针left和right。- 若
nums[left] + nums[right] > nums[k],说明当前right与left到right-1之间的所有元素组合均满足条件(因为数组有序)。此时计数增加right - left,并将right左移。 - 若
nums[left] + nums[right] <= nums[k],说明两边之和太小,需增大较小的一边,将left右移。
- 若
1.3 代码实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end()); // 升序排序
int n = nums.size();
int ret = 0;
( i = n - ; i >= ; i--) {
left = , right = i - ;
(left < right) {
(nums[left] + nums[right] > nums[i]) {
ret += right - left;
right--;
} {
left++;
}
}
}
ret;
}
};
{
vector<> nums1 = {, , , };
cout << ().(nums1) << endl;
;
}



