双指针算法实战
在有序数组的处理场景中,双指针往往能将时间复杂度从 O(n²) 优化至 O(n)。今天我们通过四个经典案例,梳理一下双指针在不同场景下的应用逻辑。
1. 有效三角形个数(LeetCode 611)
核心思路 构成三角形的条件是任意两边之和大于第三边。如果我们将三边排序为 a ≤ b ≤ c,只需满足 a + b > c 即可。利用这个单调性,我们可以固定最长边,用双指针寻找另外两边。
解题步骤
- 排序:先将数组升序排列。
- 固定最大值:从右向左遍历,将当前元素视为最长边
nums[i]。 - 双指针查找:左指针
left指向头部,右指针right指向i-1。- 若
nums[left] + nums[right] > nums[i],说明left到right-1之间的所有元素与right组合都满足条件,直接累加right - left,然后right--。 - 若和小于等于第三边,则
left++尝试更大的值。
- 若
- 去重与边界:注意
i至少为 2,且left < right。

代码实现
class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int count = 0;
// 从后往前固定最大边
for (int i = nums.size() - 1; i >= ; i--) {
left = , right = i - ;
(left < right) {
(nums[left] + nums[right] > nums[i]) {
count += right - left;
right--;
} {
left++;
}
}
}
count;
}
};


