
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
if(nums.size()<3)
return res;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size(); i++){
if(nums[i]>0)
break;
if((i-1)>=0&&nums[i] == nums[i-1]) // 后面的元素和前面的重复,直接跳过
continue;
int m = i+1;
int n = nums.size()-1;
while(m<n){
if(nums[m]+nums[n]>(-nums[i]))
n--;
else if(nums[m]+nums[n]<(-nums[i]))
m++;
else{
vector<int> temp;
while(m<n&&nums[m+1]==nums[m]) // 右边如果有重复元素直接左移一位
m++;
while(m<n&&nums[n-1] == nums[n]) // 左边有重复元素直接右移一位
n--;
temp.push_back(nums[i]);
temp.push_back(nums[m]);
temp.push_back(nums[n]);
res.push_back(temp);
m++;
n--;
}
}
}
return res;
}
};