class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
if(num.size() < 3){
return {};
}
sort(num.begin(), num.end());
vector<vector<int>> res;
int n = num.size();
for(int i=0; i<n-2; i++){
if(i>0 && num[i] == num[i-1]){
continue;
}
int left = i+1, right = n-1;
int cur_tar = 0 - num[i];
int cur_sum;
while(left < right){
cur_sum = num[left] + num[right];
if(cur_sum == cur_tar){
res.push_back({num[i], num[left], num[right]});
while(left < right && num[left] == num[left+1]){
left++;
}
while(left < right && num[right] == num[right-1]){
right--;
}
left++;
right--;
}
else if(cur_sum < cur_tar){
left++;
}
else{
right--;
}
}
}
return res;
}
};