DEV Community

Jaspreet singh
Jaspreet singh

Posted on

3Sum

3Sum is one of the most important interview problems because it introduces a powerful pattern:

Fix one element and reduce the problem to a smaller known problem.

The key insight is that after fixing one number, the remaining task becomes a 2-Sum problem, which can be solved efficiently using the Two Pointer technique.


Problem Statement

Given an integer array nums, return all unique triplets:

nums[i] + nums[j] + nums[k] = 0
Enter fullscreen mode Exit fullscreen mode

such that:

i != j
i != k
j != k
Enter fullscreen mode Exit fullscreen mode

and no duplicate triplets are allowed.


Brute Force Intuition

Generate every possible triplet using three nested loops.

for(i)
    for(j)
        for(k)
Enter fullscreen mode Exit fullscreen mode

For each triplet:

  • Calculate the sum.
  • If sum equals 0, add it to the answer.
  • Use a Set to avoid duplicates.

Interview Explanation

The brute force approach generates every possible triplet and checks whether its sum equals zero. Since there are three nested loops, we examine O(n³) combinations, making it inefficient for large inputs.

Complexity

Time  : O(n³)
Space : O(number of triplets)
Enter fullscreen mode Exit fullscreen mode

Moving Towards the Optimal Solution

Given:

a + b + c = 0
Enter fullscreen mode Exit fullscreen mode

Fix one element:

a = nums[i]
Enter fullscreen mode Exit fullscreen mode

Now we need:

b + c = -a
Enter fullscreen mode Exit fullscreen mode

This becomes a 2-Sum problem.

After sorting the array, we can solve this 2-Sum using Two Pointers.


Key Observation

After sorting:

[-4,-1,-1,0,1,2]
Enter fullscreen mode Exit fullscreen mode

Fix:

-1
Enter fullscreen mode Exit fullscreen mode

Need:

b + c = 1
Enter fullscreen mode Exit fullscreen mode

Use:

left = i + 1;
right = n - 1;
Enter fullscreen mode Exit fullscreen mode

Now:

sum < target  -> move left
sum > target  -> move right
sum == target -> triplet found
Enter fullscreen mode Exit fullscreen mode

Optimal Approach

Step 1

Sort the array.

Arrays.sort(nums);
Enter fullscreen mode Exit fullscreen mode

Step 2

Fix one element.

for(int i = 0; i < n - 2; i++)
Enter fullscreen mode Exit fullscreen mode

Step 3

Use two pointers.

left = i + 1;
right = n - 1;
Enter fullscreen mode Exit fullscreen mode

Step 4

Check the sum.

nums[i] + nums[left] + nums[right]
Enter fullscreen mode Exit fullscreen mode

Step 5

Skip duplicates from:

  • Fixed element i
  • Left pointer
  • Right pointer

This ensures unique triplets only.


Dry Run

Input

[-4,-1,-1,0,1,2]
Enter fullscreen mode Exit fullscreen mode

i = 1

nums[i] = -1

left = 2
right = 5
Enter fullscreen mode Exit fullscreen mode

Sum

-1 + (-1) + 2 = 0
Enter fullscreen mode Exit fullscreen mode

Triplet:

[-1,-1,2]
Enter fullscreen mode Exit fullscreen mode

Move pointers.

Again

-1 + 0 + 1 = 0
Enter fullscreen mode Exit fullscreen mode

Triplet:

[-1,0,1]
Enter fullscreen mode Exit fullscreen mode

Answer:

[
 [-1,-1,2],
 [-1,0,1]
]
Enter fullscreen mode Exit fullscreen mode

Optimal Java Solution

class Solution {

    public List<List<Integer>> threeSum(int[] nums) {

        Arrays.sort(nums);

        List<List<Integer>> ans = new ArrayList<>();

        int n = nums.length;

        for (int i = 0; i < n - 2; i++) {

            // Skip duplicate fixed elements
            if (i > 0 && nums[i] == nums[i - 1])
                continue;

            int left = i + 1;
            int right = n - 1;

            while (left < right) {

                int sum = nums[i] + nums[left] + nums[right];

                if (sum == 0) {

                    ans.add(Arrays.asList(
                            nums[i],
                            nums[left],
                            nums[right]
                    ));

                    left++;
                    right--;

                    // Skip duplicate left values
                    while (left < right &&
                           nums[left] == nums[left - 1]) {
                        left++;
                    }

                    // Skip duplicate right values
                    while (left < right &&
                           nums[right] == nums[right + 1]) {
                        right--;
                    }

                } else if (sum < 0) {

                    left++;

                } else {

                    right--;

                }
            }
        }

        return ans;
    }
}
Enter fullscreen mode Exit fullscreen mode

Why Duplicate Skipping Works

Consider:

[-2,0,0,0,2,2]
Enter fullscreen mode Exit fullscreen mode

Without skipping duplicates:

[-2,0,2]
[-2,0,2]
[-2,0,2]
Enter fullscreen mode Exit fullscreen mode

would be generated multiple times.

Skipping duplicates ensures each unique triplet appears exactly once.


Complexity Analysis

Time  : O(n²)

Space : O(1)
Enter fullscreen mode Exit fullscreen mode

Ignoring the output list.

Sorting takes:

O(n log n)
Enter fullscreen mode Exit fullscreen mode

and the Two Pointer scan runs:

O(n²)
Enter fullscreen mode Exit fullscreen mode

which dominates the complexity.


Pattern Recognition

Whenever you see:

  • 3Sum
  • Triplets
  • Unique combinations
  • Sum equals target

Think:

Sort
→ Fix one element
→ Solve remaining using Two Pointers
Enter fullscreen mode Exit fullscreen mode

Similarly:

2 Sum -> HashMap / Two Pointers

3 Sum -> Fix 1 + Two Pointers

4 Sum -> Fix 2 + Two Pointers

K Sum -> Recursive reduction
Enter fullscreen mode Exit fullscreen mode

Interview One-Liner

I sort the array, fix one element, and use the Two Pointer technique to find the remaining two elements whose sum balances the fixed value. Duplicate skipping at all three positions ensures unique triplets while achieving O(n²) time complexity.

Top comments (0)