Bird
Raised Fist0
DSA Cprogramming

Three Sum Problem All Unique Triplets in DSA C

Choose your learning style10 modes available
Mental Model
Find three numbers in a list that add up to zero without repeating the same triplet.
Analogy: Imagine you have a group of friends with different ages, and you want to find three friends whose ages add up exactly to zero, but you don't want to count the same group twice.
Array: [-4, -1, -1, 0, 1, 2]
Indexes:  0    1    2   3  4  5
Goal: Find triplets i, j, k where arr[i] + arr[j] + arr[k] = 0
Pointers: i ↑, j ->, k ←
Dry Run Walkthrough
Input: array: [-1, 0, 1, 2, -1, -4]
Goal: Find all unique triplets that sum to zero
Step 1: Sort the array
[-4, -1, -1, 0, 1, 2]
Why: Sorting helps to avoid duplicates and use two-pointer technique
Step 2: Set i=0 (value -4), set left=1, right=5
i=-4 ↑, left=-1 ->, right=2 ←
Why: Start checking triplets with first element -4
Step 3: Sum = -4 + (-1) + 2 = -3 < 0, move left pointer right
i=-4 ↑, left=-1 ->, right=2 ← (left moves to index 2)
Why: Sum too small, increase sum by moving left pointer
Step 4: Sum = -4 + (-1) + 2 = -3 < 0, move left pointer right
i=-4 ↑, left=-1 ->, right=2 ← (left moves to index 3)
Why: Sum still too small, move left pointer again
Step 5: Sum = -4 + 0 + 2 = -2 < 0, move left pointer right
i=-4 ↑, left=0 ->, right=2 ← (left moves to index 4)
Why: Sum still less than zero, move left pointer
Step 6: Sum = -4 + 1 + 2 = -1 < 0, move left pointer right
i=-4 ↑, left=1 ->, right=2 ← (left meets right, stop)
Why: No triplet found with i=0, move to next i
Step 7: Set i=1 (value -1), left=2, right=5
i=-1 ↑, left=-1 ->, right=2 ←
Why: Check triplets starting with -1
Step 8: Sum = -1 + (-1) + 2 = 0, record triplet [-1, -1, 2], move left and right skipping duplicates
Triplets: [-1, -1, 2]
left moves to 3, right moves to 4
Why: Found a valid triplet, move pointers to find others
Step 9: Sum = -1 + 0 + 1 = 0, record triplet [-1, 0, 1], move left and right skipping duplicates
Triplets: [-1, -1, 2], [-1, 0, 1]
left moves to 4, right moves to 3 (left >= right, stop)
Why: Found another valid triplet, no more with i=1
Step 10: Set i=2 (value -1), skip because same as previous i
Skip i=2 to avoid duplicate triplets
Why: Avoid duplicate triplets by skipping same values for i
Step 11: Set i=3 (value 0), left=4, right=5
i=0 ↑, left=1 ->, right=2 ←
Why: Check triplets starting with 0
Step 12: Sum = 0 + 1 + 2 = 3 > 0, move right pointer left
i=0 ↑, left=1 ->, right=1 ← (left >= right, stop)
Why: Sum too big, decrease sum by moving right pointer
Result:
Triplets found:
[-1, -1, 2]
[-1, 0, 1]
Annotated Code
DSA C
#include <stdio.h>
#include <stdlib.h>

int cmpfunc(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

void threeSum(int* nums, int numsSize) {
    qsort(nums, numsSize, sizeof(int), cmpfunc); // sort array
    for (int i = 0; i < numsSize - 2; i++) {
        if (i > 0 && nums[i] == nums[i - 1]) continue; // skip duplicates for i
        int left = i + 1;
        int right = numsSize - 1;
        while (left < right) {
            int sum = nums[i] + nums[left] + nums[right];
            if (sum == 0) {
                printf("[%d, %d, %d]\n", nums[i], nums[left], nums[right]);
                // skip duplicates for left
                while (left < right && nums[left] == nums[left + 1]) left++;
                // skip duplicates for right
                while (left < right && nums[right] == nums[right - 1]) right--;
                left++;
                right--;
            } else if (sum < 0) {
                left++; // increase sum
            } else {
                right--; // decrease sum
            }
        }
    }
}

int main() {
    int nums[] = {-1, 0, 1, 2, -1, -4};
    int size = sizeof(nums) / sizeof(nums[0]);
    threeSum(nums, size);
    return 0;
}
qsort(nums, numsSize, sizeof(int), cmpfunc); // sort array
sort array to enable two-pointer technique and duplicate skipping
if (i > 0 && nums[i] == nums[i - 1]) continue; // skip duplicates for i
skip duplicate values for i to avoid repeated triplets
while (left < right) { int sum = nums[i] + nums[left] + nums[right];
calculate sum of triplet candidates
if (sum == 0) { printf(...); while (left < right && nums[left] == nums[left + 1]) left++; while (left < right && nums[right] == nums[right - 1]) right--; left++; right--; }
found valid triplet, print and skip duplicates on both sides
else if (sum < 0) { left++; } else { right--; }
adjust pointers to increase or decrease sum
OutputSuccess
[-1, -1, 2] [-1, 0, 1]
Complexity Analysis
Time: O(n^2) because we sort once O(n log n) and then use two nested loops with two pointers scanning the array
Space: O(1) ignoring output space, as sorting is in-place and only pointers are used
vs Alternative: Naive approach is O(n^3) by checking all triplets; this method is faster due to sorting and two-pointer scanning
Edge Cases
empty array
no triplets found, function prints nothing
DSA C
for (int i = 0; i < numsSize - 2; i++) {
array with less than 3 elements
loop does not run, no output
DSA C
for (int i = 0; i < numsSize - 2; i++) {
array with all zeros
prints one triplet [0, 0, 0] once, skipping duplicates
DSA C
while (left < right && nums[left] == nums[left + 1]) left++;
When to Use This Pattern
When asked to find triplets summing to zero or a target with unique results, use sorting plus two-pointer scanning to efficiently find all unique triplets.
Common Mistakes
Mistake: Not sorting the array first, causing duplicate triplets and inefficient search
Fix: Sort the array before processing to enable two-pointer technique and duplicate skipping
Mistake: Not skipping duplicates for i, left, or right pointers, resulting in repeated triplets
Fix: Add checks to skip duplicate values for i, left, and right pointers after finding a valid triplet
Summary
Finds all unique triplets in an array that sum to zero.
Use when you need to find combinations of three numbers adding to zero without duplicates.
Sort the array and use two pointers to efficiently find triplets while skipping duplicates.

Practice

(1/5)
1. What is the main goal of the Three Sum Problem in data structures and algorithms?
easy
A. Find the maximum sum of any three elements
B. Sort the array in ascending order
C. Count the number of pairs that sum to zero
D. Find all unique triplets in an array that sum to zero

Solution

  1. Step 1: Understand the problem statement

    The Three Sum Problem asks to find all unique sets of three numbers in an array whose sum is zero.
  2. Step 2: Differentiate from other options

    Options A, B, and D describe different problems like maximum sum, sorting, or pairs, not triplets summing to zero.
  3. Final Answer:

    Find all unique triplets in an array that sum to zero -> Option D
  4. Quick Check:

    Three Sum Problem = Find triplets summing to zero [OK]
Hint: Remember: Three Sum finds triplets with zero sum [OK]
Common Mistakes:
  • Confusing with pair sum problems
  • Thinking it finds maximum sums
  • Assuming it sorts the array only
2. Which of the following code snippets correctly initializes the array for solving the Three Sum Problem in C?
easy
A. int nums[] = { -1, 0, 1, 2, -1, -4 }; int size = sizeof(nums) / sizeof(nums[0]);
B. int nums = { -1, 0, 1, 2, -1, -4 }; int size = 6;
C. int nums[] = (-1, 0, 1, 2, -1, -4); int size = 6;
D. int nums[] = [-1, 0, 1, 2, -1, -4]; int size = 6;

Solution

  1. Step 1: Check array initialization syntax in C

    In C, arrays are initialized with curly braces {}, not parentheses or square brackets.
  2. Step 2: Verify size calculation

    int nums[] = { -1, 0, 1, 2, -1, -4 }; int size = sizeof(nums) / sizeof(nums[0]); correctly calculates size using sizeof operator divided by element size.
  3. Final Answer:

    int nums[] = { -1, 0, 1, 2, -1, -4 }; int size = sizeof(nums) / sizeof(nums[0]); -> Option A
  4. Quick Check:

    C array init with {} and sizeof = int nums[] = { -1, 0, 1, 2, -1, -4 }; int size = sizeof(nums) / sizeof(nums[0]); [OK]
Hint: Use curly braces {} for arrays in C [OK]
Common Mistakes:
  • Using parentheses () instead of braces {}
  • Using square brackets [] for initialization
  • Not calculating size correctly
3. What will be the output of the following C code snippet that attempts to find unique triplets summing to zero?
int nums[] = {-1, 0, 1, 2, -1, -4};
int size = 6;
// Assume function threeSum prints triplets
threeSum(nums, size);
// Output format: each triplet printed as (a, b, c)
medium
A. No triplets found
B. (-4, 2, 2) (-1, 0, 1)
C. (-1, -1, 2) (-1, 0, 1)
D. (0, 0, 0) (-1, 1, 2)

Solution

  1. Step 1: Identify triplets that sum to zero

    From the array {-1, 0, 1, 2, -1, -4}, the unique triplets summing to zero are (-1, -1, 2) and (-1, 0, 1).
  2. Step 2: Verify output matches these triplets

    (-1, -1, 2) (-1, 0, 1) lists these exact triplets; other options include invalid or non-existent triplets.
  3. Final Answer:

    (-1, -1, 2) (-1, 0, 1) -> Option C
  4. Quick Check:

    Unique triplets summing zero = (-1, -1, 2) (-1, 0, 1) [OK]
Hint: Check sums of triplets carefully for zero [OK]
Common Mistakes:
  • Including duplicates like (-4, 2, 2)
  • Assuming zero triplets when some exist
  • Mixing up triplet elements
4. Identify the bug in the following C code snippet for the Three Sum Problem:
void threeSum(int* nums, int size) {
    for (int i = 0; i < size - 2; i++) {
        for (int j = i + 1; j < size - 1; j++) {
            for (int k = j + 1; k < size; k++) {
                if (nums[i] + nums[j] + nums[k] == 0) {
                    printf("(%d, %d, %d)\n", nums[i], nums[j], nums[k]);
                }
            }
        }
    }
}
medium
A. Does not avoid printing duplicate triplets
B. Loops have incorrect ranges causing out-of-bounds access
C. Sum condition should be nums[i] * nums[j] * nums[k] == 0
D. Missing return statement in void function

Solution

  1. Step 1: Analyze triplet printing logic

    The code prints any triplet summing to zero but does not check for duplicates, so duplicate triplets may print multiple times.
  2. Step 2: Check loop ranges and conditions

    Loop ranges are correct and sum condition is correct; void functions do not require return statements.
  3. Final Answer:

    Does not avoid printing duplicate triplets -> Option A
  4. Quick Check:

    Duplicate triplets not filtered = Does not avoid printing duplicate triplets [OK]
Hint: Check if duplicates are filtered in nested loops [OK]
Common Mistakes:
  • Confusing sum with product condition
  • Thinking void needs return
  • Assuming loops cause out-of-bounds
5. Given the array int nums[] = {0, 0, 0, 0}; and size 4, what is the correct output of a Three Sum solution that finds all unique triplets summing to zero?
hard
A. No triplets found
B. (0, 0, 0)
C. (0, 0, 0) (0, 0, 0)
D. (0, 0, 0) (0, 0, 0) (0, 0, 0)

Solution

  1. Step 1: Identify unique triplets summing to zero

    All elements are zero, so the only unique triplet is (0, 0, 0).
  2. Step 2: Avoid duplicates in output

    Even though multiple combinations exist, only one unique triplet should be printed.
  3. Final Answer:

    (0, 0, 0) -> Option B
  4. Quick Check:

    Unique triplet from zeros = (0, 0, 0) [OK]
Hint: Only print unique triplets, even if duplicates exist [OK]
Common Mistakes:
  • Printing duplicate triplets multiple times
  • Assuming no triplets because all zeros
  • Confusing triplet uniqueness
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard