MediumNeetCode150ArrayTwo PointersSorting

3Sum

Return all unique triplets that sum to zero.

Examples

Input
nums = [-1,0,1,2,-1,-4]
Output
[[-1,-1,2],[-1,0,1]]

Distinct triplets summing to zero.

Constraints

  • 3<=nums.length<=3000
  • -10^5<=nums[i]<=10^5

Approaches

Check all triplets.

Code
def threeSum(nums):
    r=[]; nums.sort()
    for i in range(len(nums)-2):
        for j in range(i+1,len(nums)-1):
            for k in range(j+1,len(nums)):
                if nums[i]+nums[j]+nums[k]==0:
                    t=[nums[i],nums[j],nums[k]]
                    if t not in r: r.append(t)
    return r

Sort then two pointers.

Code
def threeSum(nums):
    r=[]; nums.sort()
    for i in range(len(nums)-2):
        if i>0 and nums[i]==nums[i-1]: continue
        l,r_=i+1,len(nums)-1
        while l<r_:
            t=nums[i]+nums[l]+nums[r_]
            if t==0:
                r.append([nums[i],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 t<0: l+=1
            else: r_-=1
    return r

Same as optimized.

Diagram

nums=[-4,-1,-1,0,1,2], skip dup, two pointers
Code
def threeSum(nums):
    res=[]; nums.sort()
    for i in range(len(nums)):
        if i>0 and nums[i]==nums[i-1]: continue
        l,r_=i+1,len(nums)-1
        while l<r_:
            t=nums[i]+nums[l]+nums[r_]
            if t<0: l+=1
            elif t>0: r_-=1
            else:
                res.append([nums[i],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
    return res

Complexity Comparison

Brute Force
T: O(n^3)S: O(1)

Check all triplets.

Two Pointers
T: O(n^2)S: O(1)

Sort then two pointers.

Two Pointers with Dedup
T: O(n^2)S: O(1)

Same as optimized.

Common Mistakes

Not skipping first element duplicates

Not moving both pointers after match

Forgetting to sort

Try It Yourself

Copy the optimal solution and run it in our compiler.

Open in Compiler