15.三数之和
思路:排序+双指针
1.对nums排序
2.外层for遍历i,并对i去重
3.内层while双指针j k
(1)``nums[i]+nums[j]+nums[k]>0`此时双指针k偏大,左移动
(2)``nums[i]+nums[j]+nums[k]<0`此时双指针j偏小,右移动
(1)``nums[i]+nums[j]+nums[k]==0`此时记录结果,移动jk,然后对jk去重
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
vector<int>tmp;
int n=nums.size();
sort(nums.begin(),nums.end());
for(int i=0;i<n;i++){
//对i去重
if(i>0 && nums[i]==nums[i-1])
continue;
int j=i+1;
int k=n-1;
while(j<k){
if(nums[i]+nums[j]+nums[k]>0){
k--;
}else if(nums[i]+nums[j]+nums[k]<0){
j++;
}else{ //相等时记录结果并对j k去重
res.push_back({nums[i],nums[j],nums[k]});
j++;
k--;
while(j<k && nums[j]==nums[j-1]){
j++;
}
while(j<k && nums[k]==nums[k+1]){
k--;
}
}
}
}
return res;
}
};