1 minute read

<-M 18> 4Sum

// Method 1
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        set<vector<int>>myList;
        sort(nums.begin(), nums.end());
        if(nums.size() < 4){
            return vector<vector<int>>();
        }

        for(int i = 0; i < nums.size(); i++){
            for(int j = i + 1; j < nums.size(); j++){
                int x = j + 1, y = nums.size() - 1;
                long long findSum = target - (long)nums[i] - (long)nums[j];

                while(x < y){
                    long long sum = nums[x] + nums[y];
                    if(sum > findSum)
                        y--;
                    else if(sum < findSum)
                        x++;
                    else{
                        myList.insert({nums[i], nums[j], nums[x], nums[y]});
                        x++;
                        y--;
                    }
                }
            }
        }

    return vector<vector<int>> (myList.begin(), myList.end());
    }
};

// Method 2
class Solution {
public:
        vector<vector<int>> fourSum(vector<int>& nums, int target) {
        int i,j , left, right, n = nums.size();
        vector<vector<int>> result;
        if(n<4 || nums.empty())
            return result;
        sort(nums.begin(),nums.end());
        for(i = 0;i < n - 3; i++) {
            long long int target_3 = target - nums[i];
            if(i > 0 && nums[i] == nums[i-1])
                continue;
            int presentI, presentJ;
            for(j = i + 1; j < n - 2; j++) {
                long long int target_2 = target_3  - nums[j];
                if(j > i + 1 && nums[j] == nums[j - 1])
                    continue;
                if(nums[j + 1] + nums[j + 2] > target_2)
                    break;
                if(nums[n - 2] + nums[n - 1] < target_2)
                    continue;
                left = j + 1;
                right = n - 1;
                while(left < right) {
                    int two_sum = nums[left] + nums[right];
                    if(two_sum < target_2)
                        left++;
                    else if(two_sum > target_2)
                        right--;
                    else {
                        result.push_back(vector<int>{nums[i], nums[j], nums[left], nums[right]});
                        int presentLeft = nums[left], presentRight = nums[right];
                        presentI=nums[i];
                        presentJ=nums[j];
                        do {
                            left++;
                        } while(nums[left] == presentLeft && left < right);
                        do {
                            right--;
                        } while(nums[right] == presentRight && left < right);
                    }
                }
            }
        }
        return result;
    }
};