class Solution {
public:    
    /**
     * @param numbers : Give an array numbers of n integer
     * @return : Find all unique triplets in the array which gives the sum of zero.
     */
    vector<vector<int> > threeSum(vector<int> &nums) {
        // write your code here
        int size = nums.size();
        vector<vector<int>> results;

        sort(nums.begin(), nums.end());
        //use -nums[i] to do 2 sum;
        for (int i = 0; i < nums.size(); i++) {
            //check for duplicated number
            if (i > 0 && nums[i] == nums[i-1]) {
                continue;
            }
            int target = -nums[i];
            int left = i + 1;
            int right = nums.size() - 1;
            twoSum (nums, left, right, target, results);

        }
        return results;
    }

    void twoSum (vector<int> &nums, int start, int end, int target, vector<vector<int>> &results) {
        int left = start;
        int right = end;
        while (left < right) {
            int sum = nums[left] + nums[right];
            if (left < right && sum == target) {
                vector<int> solution;
                solution.push_back(nums[start - 1]);
                solution.push_back(nums[left]);
                solution.push_back(nums[right]);
                results.push_back(solution);
                left++;
                right--;
                //check for duplicated left and right
                while (left < right && nums[left] == nums[left - 1]) {
                    left++;
                }

                while (left < right && nums[right] == nums[right + 1]) {
                    right--;
                }
            }   
            if (left < right && sum < target) {
                left++;
            }
            if (left < right && sum > target) {
                right--;
            }
        }
    }

};

results matching ""

    No results matching ""