Data Structures and Algorithms (DSA)  

3 Sum Problem in DSA (Example and Optimized Solution)

Introduction

The 3 Sum Problem is a very popular DSA interview question and is a natural extension of the Two Sum problem. In this problem, you are asked to find three numbers in an array whose sum is equal to zero.

This question helps interviewers understand your knowledge of arrays, sorting, the two-pointer technique, and handling duplicates.

In this article, the 3 Sum problem is explained in simple words, with clear examples and easy-to-follow code.

What is the 3 Sum Problem?

You are given an array of integers. Your task is to find all unique triplets in the array such that the sum of the three numbers is zero.

Important points to remember:

  • The triplets must be unique

  • The order of numbers inside a triplet does not matter

Example

Input:  [-1, 0, 1, 2, -1, -4]
Output: [[-1, -1, 2], [-1, 0, 1]]

Explanation

The two triplets whose sum is zero are:

  • (-1) + (-1) + 2 = 0

  • (-1) + 0 + 1 = 0

Brute Force Approach (Easy but Slow)

The simplest way to solve the 3 Sum problem is to use three nested loops and check all possible triplets.

How it works

  • Pick the first number

  • Pick the second number

  • Pick the third number

  • Check if their sum is zero

Drawbacks

  • Time Complexity becomes O(n³)

  • Very slow for large arrays

Because of this, brute force is not suitable for interviews.

Optimized Approach Using Sorting and Two Pointers

The most efficient and commonly used approach for 3 Sum is:

  • Sort the array

  • Fix one element

  • Use two pointers to find the remaining two numbers

This reduces unnecessary checks and improves performance.

Step-by-Step Explanation

Let us understand the logic clearly.

Steps:

  1. Sort the array

  2. Loop through the array and fix one element at a time

  3. For the fixed element, use two pointers:

    • One pointer starts from the next index

    • Another pointer starts from the end

  4. Check the sum of the three numbers

  5. Move pointers based on whether the sum is less than, greater than, or equal to zero

  6. Skip duplicate values to avoid repeated triplets

Dry Run Example

Sorted array: [-4, -1, -1, 0, 1, 2]

Fix first element = -1

LeftRightSumAction
-120Triplet found
010Triplet found

Both valid triplets are stored and duplicates are skipped.

Code Implementation

C++ Code

vector<vector<int>> threeSum(vector<int>& nums) {
    vector<vector<int>> result;
    sort(nums.begin(), nums.end());

    for (int i = 0; i < nums.size(); i++) {
        if (i > 0 && nums[i] == nums[i - 1]) continue;

        int left = i + 1;
        int right = nums.size() - 1;

        while (left < right) {
            int sum = nums[i] + nums[left] + nums[right];

            if (sum == 0) {
                result.push_back({nums[i], nums[left], nums[right]});

                while (left < right && nums[left] == nums[left + 1]) left++;
                while (left < right && nums[right] == nums[right - 1]) right--;

                left++;
                right--;
            }
            else if (sum < 0) {
                left++;
            }
            else {
                right--;
            }
        }
    }
    return result;
}

Java Code

public List<List<Integer>> threeSum(int[] nums) {
    List<List<Integer>> result = new ArrayList<>();
    Arrays.sort(nums);

    for (int i = 0; i < nums.length; i++) {
        if (i > 0 && nums[i] == nums[i - 1]) continue;

        int left = i + 1;
        int right = nums.length - 1;

        while (left < right) {
            int sum = nums[i] + nums[left] + nums[right];

            if (sum == 0) {
                result.add(Arrays.asList(nums[i], nums[left], nums[right]));

                while (left < right && nums[left] == nums[left + 1]) left++;
                while (left < right && nums[right] == nums[right - 1]) right--;

                left++;
                right--;
            }
            else if (sum < 0) {
                left++;
            }
            else {
                right--;
            }
        }
    }
    return result;
}

Python Code

def threeSum(nums):
    nums.sort()
    result = []

    for i in range(len(nums)):
        if i > 0 and nums[i] == nums[i - 1]:
            continue

        left, right = i + 1, len(nums) - 1

        while left < right:
            total = nums[i] + nums[left] + nums[right]

            if total == 0:
                result.append([nums[i], nums[left], nums[right]])

                while left < right and nums[left] == nums[left + 1]:
                    left += 1
                while left < right and nums[right] == nums[right - 1]:
                    right -= 1

                left += 1
                right -= 1
            elif total < 0:
                left += 1
            else:
                right -= 1

    return result

Time and Space Complexity

  • Time Complexity: O(n²)

  • Space Complexity: O(1) (excluding output list)

This is the most optimized and accepted solution for the 3 Sum problem.

Edge Cases to Consider

  • Array size less than 3

  • All elements are zero

  • Large negative or positive values

  • Duplicate numbers in the array

Handling duplicates correctly is very important.

Common Interview Variations of 3 Sum

  • 3 Sum closest to target

  • Count number of triplets

  • 3 Sum in sorted array

  • K Sum problem (general version of 3 Sum)

Summary

The 3 Sum Problem is an important DSA question that builds on sorting and the two pointer technique. By sorting the array and carefully moving pointers while skipping duplicates, you can find all valid triplets efficiently. Understanding this problem helps you solve advanced problems like 4 Sum and K Sum and prepares you well for technical interviews.