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;
    }
};