Generate All Combinations Sum K in DSA Javascript - Time & Space Complexity
We want to understand how the time needed to find all combinations that add up to a target grows as the input size changes.
How does the number of combinations affect the work done?
Analyze the time complexity of the following code snippet.
function combinationSumK(nums, target) {
const result = [];
function backtrack(start, path, sum) {
if (sum === target) {
result.push([...path]);
return;
}
if (sum > target) return;
for (let i = start; i < nums.length; i++) {
path.push(nums[i]);
backtrack(i + 1, path, sum + nums[i]);
path.pop();
}
}
backtrack(0, [], 0);
return result;
}
This code finds all unique combinations of numbers that add up to the target sum.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive calls exploring combinations by looping through remaining numbers.
- How many times: Potentially explores all subsets of the input array, which can be up to 2n combinations.
As the input size grows, the number of possible combinations grows very fast because each number can be either included or excluded.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 1,000 combinations explored |
| 20 | About 1,000,000 combinations explored |
| 30 | About 1,000,000,000 combinations explored |
Pattern observation: The work grows exponentially as input size increases, doubling roughly with each added element.
Time Complexity: O(2n * k)
This means the time grows exponentially with the number of input elements, multiplied by the average length of each combination.
[X] Wrong: "The time complexity is just O(n) because we loop through the array once."
[OK] Correct: The code explores many combinations recursively, not just a single pass, so the work grows exponentially, not linearly.
Understanding this exponential growth helps you explain why some problems need careful pruning or different approaches, a skill valued in interviews.
"What if we allowed numbers to be reused unlimited times? How would the time complexity change?"
Practice
Solution
Step 1: Understand the problem goal
The problem asks to find all unique sets of numbers that sum exactly to K.Step 2: Clarify what combinations mean
Combinations mean groups of numbers without regard to order, all adding to K.Final Answer:
All unique combinations of numbers that add up to K -> Option AQuick Check:
Combinations sum to K = All unique combinations of numbers that add up to K [OK]
- Confusing combinations with permutations
- Looking for counts instead of actual combinations
- Trying to find products instead of sums
Solution
Step 1: Identify correct recursive function signature
The function needs parameters for numbers, target sum, start index, current path, and result storage.Step 2: Check options for these parameters
Only function findCombos(nums, target, start, path, result) { ... } includes all necessary parameters for recursion and backtracking.Final Answer:
function findCombos(nums, target, start, path, result) { ... } -> Option CQuick Check:
Recursive function with all params = function findCombos(nums, target, start, path, result) { ... } [OK]
- Missing parameters needed for recursion
- Returning wrong values instead of building combinations
- Not including start index to avoid duplicates
function combinationSum(nums, target) {
const result = [];
function backtrack(start, path, sum) {
if (sum === target) {
result.push([...path]);
return;
}
if (sum > target) return;
for (let i = start; i < nums.length; i++) {
path.push(nums[i]);
backtrack(i + 1, path, sum + nums[i]);
path.pop();
}
}
backtrack(0, [], 0);
return result;
}
console.log(combinationSum([2,3,6,7], 7));Solution
Step 1: Understand the code logic
The function finds combinations of numbers from the array that sum to 7 without reuse (i + 1).Step 2: Trace the combinations
Only 7 alone sums to 7; others like 2+3=5, 2+3+6=11 exceed or don't match target.Final Answer:
[[7]] -> Option AQuick Check:
Only [7] sums to 7 without repeats = [[7]] [OK]
- Assuming numbers can be reused multiple times
- Including combinations that exceed target
- Not copying path array before pushing
function findCombos(nums, target) {
const result = [];
function backtrack(start, path, sum) {
if (sum === target) {
result.push(path);
return;
}
if (sum > target) return;
for (let i = start; i < nums.length; i++) {
path.push(nums[i]);
backtrack(i + 1, path, sum + nums[i]);
path.pop();
}
}
backtrack(0, [], 0);
return result;
}Solution
Step 1: Check how results are stored
The code pushes 'path' directly, which is a reference and will change later.Step 2: Identify correct way to store combinations
Must push a copy of path (e.g., [...path]) to save current state.Final Answer:
The path array is pushed directly without copying, causing reference issues -> Option BQuick Check:
Push copy of path, not reference = The path array is pushed directly without copying, causing reference issues [OK]
- Pushing path reference instead of copy
- Incorrect loop start index causing duplicates
- Missing base case for sum equal to target
[1, 2, 3, 4] and target sum 5, which of the following is the correct set of all unique combinations that sum to 5, assuming numbers can be used only once?Solution
Step 1: List all combinations without reuse that sum to 5
Possible pairs: 1+4=5, 2+3=5; triples or singles don't sum to 5 without reuse.Step 2: Verify options against these combinations
[[1,4],[2,3]] matches these pairs exactly; others include duplicates or invalid sums.Final Answer:
[[1,4],[2,3]] -> Option DQuick Check:
Unique pairs summing to 5 = [[1,4],[2,3]] [OK]
- Including repeated numbers when only single use allowed
- Assuming single number 5 exists in array
- Counting invalid sums or duplicates
Ready to prove it?
Pass the test and this pattern moves unknown
