双指针算法进阶:三角形与多数之和
双指针是处理有序数组问题的利器。通过固定一端或两端移动指针,可以高效解决求和、计数等经典问题。本文结合四个 LeetCode 高频题,深入剖析排序后双指针的实战技巧。
611. 有效三角形个数
题目描述
给定一个包含非负整数的数组,找出其中能组成三角形的三元组个数。
核心思路
构成三角形的条件是任意两边之和大于第三边。对于排序后的数组,若 a <= b <= c,只需满足 a + b > c 即可。
利用单调性,我们可以固定最长边(第三边),然后用双指针寻找满足条件的另外两边。
解题步骤
- 排序:将数组升序排列。
- 固定最大边:从右向左遍历,将当前元素视为最长边
c。 - 双指针查找:左指针
left指向首元素,右指针right指向最大边左侧第一个元素。- 若
nums[left] + nums[right] > nums[i]:说明left到right-1之间的所有元素与right组合均满足条件,累加right - left,然后right--继续尝试更小的组合。 - 若
nums[left] + nums[right] <= nums[i]:说明left太小,需要left++增大和值。
- 若
- 终止条件:当
left >= right时结束内层循环。
注意:由于需要三个边,外层循环从倒数第三个元素开始(索引
size() - 3)。

代码实现
class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end()); // 升序排序
int count = 0;
// 从右往左依次将最大值作为第三边
for (int i = nums.() - ; i >= ; i--) {
left = ;
right = i - ;
(left < right) {
(nums[left] + nums[right] > nums[i]) {
count += right - left;
right--;
} {
left++;
}
}
}
count;
}
};


