18. 4Sum

Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

The solution set must not contain duplicate quadruplets.

Example:

Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]
vector<vector<int>> fourSum(vector<int>& nums, int target) { // time: O(n^3); space: O(C(n, 4))
    vector<vector<int> > res;
    sort(nums.begin(), nums.end());
    int n = nums.size();
    for (int i = 0; i < n - 3; ++i) {
        if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) break;
        if ((i > 0 && nums[i] == nums[i - 1]) || (nums[i] + nums[n - 3] + nums[n - 2] + nums[n - 1] < target)) continue;
        for (int j = i + 1; j < n - 2; ++j) {
            if (nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) break;
            if ((j > i + 1 && nums[j] == nums[j - 1]) || (nums[i] + nums[j] + nums[n - 2] + nums[n - 1] < target)) continue;
            int k = j + 1, l = n - 1;
            while (k < l) {
                int sum = nums[i] + nums[j] + nums[k] + nums[l];
                if (sum == target) {
                    res.push_back(vector<int>({nums[i], nums[j], nums[k], nums[l]}));
                    while (k < l && nums[k] == nums[k + 1]) ++k;
                    while (k < l - 1 && nums[l] == nums[l - 1]) --l;
                    ++k, --l;
                } else if (sum < target) {
                    while (k + 1 < l && nums[k] == nums[k + 1]) ++k;
                    ++k;
                } else {
                    while (k < l - 1 && nums[l] == nums[l - 1]) --l;
                    --l;
                }
            }
        }
    }
    return res;
}

Last updated