Three Sum Problem All Unique Triplets in DSA C++ - Time & Space Complexity
We want to understand how the time needed to find all unique triplets that sum to zero grows as the input list gets bigger.
How does the number of steps change when the list size increases?
Analyze the time complexity of the following code snippet.
// Find all unique triplets that sum to zero
vector> threeSum(vector& nums) {
sort(nums.begin(), nums.end());
vector> result;
for (int i = 0; i < (int)nums.size(); i++) {
if (i > 0 && nums[i] == nums[i-1]) continue;
int left = i + 1, right = (int)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;
}
This code finds all unique sets of three numbers in the list that add up to zero by sorting and using two pointers.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The outer loop runs through each element, and inside it, a two-pointer scan moves through the remaining elements.
- How many times: The outer loop runs n times, and the inner two-pointer loop runs up to n times combined for each outer iteration.
As the list size grows, the sorting step takes more time, and the nested loops check pairs for each element.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 100 to 200 steps |
| 100 | About 10,000 to 20,000 steps |
| 1000 | About 1,000,000 to 2,000,000 steps |
Pattern observation: The operations grow roughly with the square of the input size after sorting.
Time Complexity: O(n2)
This means if the list doubles in size, the time to find all triplets roughly quadruples.
[X] Wrong: "The two-pointer part inside the loop runs n times for each element, so total time is O(n3) because of three nested loops."
[OK] Correct: The two-pointer approach moves inward from both ends and together covers the remaining elements only once per outer loop, so it is not a full nested loop of n times n times n.
Understanding this time complexity helps you explain how to efficiently find triplets without checking every combination, a common skill interviewers appreciate.
"What if the input array was not sorted and we skipped sorting? How would the time complexity change?"
Practice
Three Sum Problem All Unique Triplets in an integer array?Solution
Step 1: Understand the problem statement
The problem asks to find all unique sets of three numbers in the array whose sum equals zero.Step 2: Clarify uniqueness and sum condition
Each triplet must be unique (no duplicates) and the sum of the three numbers must be exactly zero.Final Answer:
Find all unique triplets that sum to zero -> Option AQuick Check:
Unique triplets with sum zero = Find all unique triplets that sum to zero [OK]
- Confusing pairs with triplets
- Ignoring uniqueness of triplets
- Looking for max or min sums instead of zero sum
nums before applying the two-pointer technique in the Three Sum problem?Solution
Step 1: Identify correct sorting syntax for std::vector
For a vector, sorting requires iterators:nums.begin()andnums.end().Step 2: Check each option
std::sort(nums.begin(), nums.end()); uses correct syntax. sort(nums, nums + nums.size()); is invalid becausenumsis a vector, not a pointer array. nums.sort(); is invalid because vector has nosort()method. std::sort(nums); is invalid becausestd::sortrequires two iterators.Final Answer:
std::sort(nums.begin(), nums.end()); -> Option DQuick Check:
Correct vector sorting = std::sort(nums.begin(), nums.end()); [OK]
- Using pointer syntax on vectors
- Calling sort() as a vector method
- Passing only one argument to std::sort
std::vector<int> nums = {-1, 0, 1, 2, -1, -4};
std::vector result;
std::sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue;
int left = i + 1, 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--;
}
}
}
for (auto &triplet : result) {
for (int num : triplet) std::cout << num << ' ';
std::cout << '\n';
}Solution
Step 1: Sort the array and initialize pointers
Sorted array: [-4, -1, -1, 0, 1, 2]. Loop through each element with two pointers to find triplets summing to zero.Step 2: Identify unique triplets with sum zero
Triplets found are [-1, -1, 2] and [-1, 0, 1]. These are printed line by line.Final Answer:
-1 -1 2 -1 0 1 -> Option BQuick Check:
Unique triplets = [-1, -1, 2] and [-1, 0, 1] [OK]
- Not skipping duplicates
- Incorrect pointer movement
- Printing wrong triplets
std::vector<int> nums = {-2, 0, 1, 1, 2};
std::vector result;
std::sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 2; i++) {
int left = i + 1, 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]});
left++;
right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
Solution
Step 1: Analyze duplicate handling for
The code does not skip duplicate values forii, which can cause duplicate triplets in the result.Step 2: Confirm other parts are correct
Sorting is correct, pointers are initialized properly, andpush_backis valid here.Final Answer:
Missing check to skip duplicateivalues -> Option AQuick Check:
Skipping duplicates foriavoids repeated triplets [OK]
i to avoid repeated triplets [OK]- Not skipping duplicates for
i - Skipping duplicates only for pointers
- Assuming sorting fixes duplicates automatically
nums = {0, 0, 0, 0}, what is the correct output of the Three Sum problem that finds all unique triplets summing to zero?Solution
Step 1: Understand the input with duplicates
All elements are zero, so the only triplet summing to zero is [0, 0, 0].Step 2: Ensure uniqueness of triplets
Even though multiple zeros exist, only one unique triplet [0, 0, 0] should be returned.Final Answer:
[[0, 0, 0]] -> Option CQuick Check:
Unique triplet with zeros = [[0, 0, 0]] [OK]
- Returning duplicate triplets
- Returning pairs instead of triplets
- Returning empty result for all zeros
Ready to prove it?
Pass the test and this pattern moves unknown
