Time Cost

21min16s

Code

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        std::sort(nums.begin(), nums.end());
        set<vector<int>> result;
        for (int i=0; i<nums.size(); i++) {
            // fixed i
            int left = i+1, right = nums.size()-1;
            while (left < right) {
                if (nums[left] + nums[right] < -nums[i]) {
                    // keep right-forwarding
                    int prev = nums[left];
                    do {
                        left++;
                        if (nums[left] != prev) break;
                    } while (left < right);
                }else if (nums[left] + nums[right] > -nums[i]) {
                    // keep left-forwarding
                    int prev = nums[right];
                    do {
                        right--;
                        if (nums[right] != prev) break;
                    } while (left < right);
                } else {
                    // same
                    result.insert({nums[i], nums[left], nums[right]});
                    int prev = nums[left];
                    do {
                        left++;
                        if (nums[left] != prev) break;
                    } while (left < right);
                    prev = nums[right];
                    do {
                        right--;
                        if (nums[right] != prev) break;
                    } while (left < right);
                }
            }
        }
        vector<vector<int>> v(result.begin(), result.end());
        return v;
    }
};