Backtracking
Combination Sum
DESCRIPTION (inspired by Leetcode.com)
Given an array of distinct integers candidates and a target integer target, generate all unique combinations of candidates which sum to target. The combinations may be returned in any order, and the same number may be chosen from candidates an unlimited number of times.
Constraints:
- All values in candidates are positive integers.
- 1 <= candidates.length <= 30
- 2 <= candidates[i] <= 40
- All elements of candidates are distinct.
- 1 <= target <= 40
Input:
candidates = [2,3,6,7] target = 7
Output:
[[2,2,3],[7]]
Explanation:
2 and 3 are candidates, and 2 + 2 + 3 = 7. Note that 2 can be used multiple times. 7 is a candidate, and 7 = 7. These are the only two combinations.
Solution
def combinationSum(candidates, target):def backtrack(start, combo, current_target):if current_target == 0:result.append(list(combo))returnfor i in range(start, len(candidates)):curr = candidates[i]if candidates[i] > current_target:returncombo.append(curr)backtrack(i, combo, current_target - curr)combo.pop()returncandidates.sort()result = []backtrack(0, [], target)return result
combination sum
0 / 56
Explanation
def combinationSum(candidates, target):def backtrack(start, combo, current_target):if current_target == 0:result.append(list(combo))returnfor i in range(start, len(candidates)):curr = candidates[i]if candidates[i] > current_target:returncombo.append(curr)backtrack(i, combo, current_target - curr)combo.pop()returncandidates.sort()result = []backtrack(0, [], target)return result
combination sum
0 / 1
def combinationSum(candidates, target):def backtrack(start, combo, current_target):if current_target == 0:result.append(list(combo))returnfor i in range(start, len(candidates)):curr = candidates[i]if candidates[i] > current_target:returncombo.append(curr)backtrack(i, combo, current_target - curr)combo.pop()returncandidates.sort()result = []backtrack(0, [], target)return result
sort candidates
0 / 10
def combinationSum(candidates, target):def backtrack(start, combo, current_target):if current_target == 0:result.append(list(combo))returnfor i in range(start, len(candidates)):curr = candidates[i]if candidates[i] > current_target:returncombo.append(curr)backtrack(i, combo, current_target - curr)combo.pop()returncandidates.sort()result = []backtrack(0, [], target)return result
def backtrack(start, combo, current_target):if current_target == 0:result.append(list(combo))returnfor i in range(start, len(candidates)):curr = candidates[i]if candidates[i] > current_target:returncombo.append(curr)backtrack(i, combo, current_target - curr)combo.pop()return
def backtrack(start, combo, current_target):if current_target == 0:result.append(list(combo))returnfor i in range(start, len(candidates)):curr = candidates[i]if candidates[i] > current_target:returncombo.append(curr)backtrack(i, combo, current_target - curr)combo.pop()return
def backtrack(start, combo, current_target):if current_target == 0:result.append(list(combo))returnfor i in range(start, len(candidates)):curr = candidates[i]if candidates[i] > current_target:returncombo.append(curr)backtrack(i, combo, current_target - curr)combo.pop()return
def backtrack(start, combo, current_target):if current_target == 0:result.append(list(combo))returnfor i in range(start, len(candidates)):curr = candidates[i]if candidates[i] > current_target:returncombo.append(curr)backtrack(i, combo, current_target - curr)combo.pop()return
i = 0
0 / 2
Complexity
Test Your Knowledge
Login to take the complexity quiz and track your progress
Complexity Analysis
Time Complexity: O(n^(T/m)) Let n be the number of candidates, T be the target value, and m be the smallest candidate. In the worst case, the recursion tree branches up to n ways at each level, and the maximum depth is T/m (achieved by repeatedly picking the smallest candidate). This gives an upper bound of O(n^(T/m)) nodes in the recursion tree. The sorting step takes O(n log n), which is dominated by the backtracking.
Space Complexity: O(T/m) The recursion goes at most T/m levels deep (each level subtracts at least m from the remaining target), so the call stack and the current combination together use O(T/m) space. We don't count the output list itself.
Mark as read
Unlock Premium Coding Content
On This Page
Your account is free and you can post anonymously if you choose.