Skip to main content

LeetCode 15 – 3Sum Explained (Two Pointer Approach)

LeetCode 15 – 3Sum (Two Pointer Approach)

Given an integer array nums, the task is to find all unique triplets [nums[i], nums[j], nums[k]] such that:

  • i ≠ j ≠ k
  • nums[i] + nums[j] + nums[k] = 0
  • No duplicate triplets are allowed

Key Idea

The problem can be reduced to a combination of:

  • Sorting the array
  • Fixing one element
  • Using the two-pointer technique to find the remaining two numbers

This transforms the problem into a repeated Two Sum search on a sorted array.


Step-by-Step Approach

1. Sort the Array

Sorting allows us to:

  • Use two pointers efficiently
  • Skip duplicate values easily
  • Stop early when the numbers become positive

2. Fix One Element

We iterate through the array and fix one element nums[i]. The goal becomes finding two numbers whose sum is -nums[i].

3. Apply Two Pointers

  • Left pointer l = i + 1
  • Right pointer r = n - 1

Move pointers based on the sum:

  • If sum is too small → move l forward
  • If sum is too large → move r backward
  • If sum matches → store the triplet

4. Skip Duplicates

To avoid duplicate triplets:

  • Skip duplicate fixed elements
  • Skip duplicate values for both pointers after a valid triplet is found

5. Early Termination

If nums[i] > 0, stop the loop. Three positive numbers can never sum to zero.


Python Implementation


class Solution:
    def threeSum(self, nums):
        nums.sort()
        result = []
        n = len(nums)

        for i in range(n - 2):

            if i > 0 and nums[i] == nums[i - 1]:
                continue

            if nums[i] > 0:
                break

            l, r = i + 1, n - 1
            target = -nums[i]

            while l < r:
                s = nums[l] + nums[r]

                if s == target:
                    result.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 s > target:
                    r -= 1
                else:
                    l += 1

        return result

Complexity Analysis

  • Time Complexity: O(n²)
  • Space Complexity: O(1) (excluding output)

Final Takeaway

The 3Sum problem is a classic example of combining:

  • Sorting
  • Two-pointer technique
  • Careful duplicate handling

Once this pattern is understood, it becomes much easier to solve related problems like 4Sum, Closest Sum, and other pointer-based array problems.

Comments