4Sum [Medium] — Sort + Two Pointers

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Problem Statement

Given an array, return all unique quadruplets [a,b,c,d] where a+b+c+d == target.

Input: nums=[1,0,-1,0,-2,2], target=0
Output: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

Intuition

Sort + two outer loops (indices i, j) + two-pointer inner loop (left, right). Skip duplicates at all four levels.


Solutions

C++

vector<vector<int>> fourSum(vector<int>& nums, int target) {
    sort(nums.begin(), nums.end());
    vector<vector<int>> res;
    int n = nums.size();
    for (int i=0;i<n-3;i++){
        if(i>0&&nums[i]==nums[i-1]) continue;
        for(int j=i+1;j<n-2;j++){
            if(j>i+1&&nums[j]==nums[j-1]) continue;
            int l=j+1, r=n-1;
            while(l<r){
                long sum=(long)nums[i]+nums[j]+nums[l]+nums[r];
                if(sum==target){
                    res.push_back({nums[i],nums[j],nums[l++],nums[r--]});
                    while(l<r&&nums[l]==nums[l-1])l++;
                    while(l<r&&nums[r]==nums[r+1])r--;
                } else if(sum<target) l++;
                else r--;
            }
        }
    }
    return res;
}

Python

def fourSum(nums: list[int], target: int) -> list[list[int]]:
    nums.sort()
    res, n = [], len(nums)
    for i in range(n-3):
        if i > 0 and nums[i] == nums[i-1]: continue
        for j in range(i+1, n-2):
            if j > i+1 and nums[j] == nums[j-1]: continue
            l, r = j+1, n-1
            while l < r:
                s = nums[i]+nums[j]+nums[l]+nums[r]
                if s == target:
                    res.append([nums[i],nums[j],nums[l],nums[r]])
                    while l < r and nums[l] == nums[l+1]: l += 1
                    while l < r and nums[r] == nums[r-1]: r -= 1
                    l += 1; r -= 1
                elif s < target: l += 1
                else: r -= 1
    return res

Complexity

  • Time: O(n³)
  • Space: O(1) (output excluded)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro