class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
// 双指针法
vector<vector<int> > res;
for(int i=0;i<nums.size();){
int a=nums[i];
int l=i+1,r=nums.size()-1;
while(l<r){
int s=nums[l]+nums[r];
if(s<-a) l++;
else if(s>-a) r--;
else{
res.push_back({nums[l],nums[r],a});
int b=nums[l++];
while(l<r&&nums[l]==b) l++;
b=nums[r--];
while(l<r&&nums[r]==b) r--;
}
}
i++;
while(i<nums.size()&&a==nums[i]) i++;
}
return res;
}
};
思路:
我们可以先枚举 a, 然后在区间[pos(a)+1,nums.size()-1] 内通过 双指针或者其他别的算法获得答案
总结:
对于任何一个 求某个区间内,两个数a,b之和是否=target
的问题,我们可以先变化等式 a=target-b
, 然后用双指针或者 哈希表来处理