双指针应用场景
双指针技术常用于处理有序数组或链表中的搜索与匹配问题,主要包括快慢指针和对撞指针两种模式。
1. 有效三角形个数
题目描述
给定一个包含非负整数的数组 nums,返回其中可以组成三角形三元组的个数。
算法思路
- 构成三角形的条件是任意两边之和大于第三边。对于排序后的三个数 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--。
- 否则 left++ 增大两边之和。
核心代码
#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;
for (int i = n - 1; i >= 2; i--) {
int left = 0, right = i - 1;
while (left < right) {
if (nums[left] + nums[right] > nums[i]) {
ret += right - left;
right--;
} else {
left++;
}
}
}
ret;
}
};


