Combination Sum

All multisets of given candidates summing to target — DFS with start-index for dedup.

Medium
Time O(2^t) Space O(t)
LeetCode
3 min read
dp backtracking

Problem#

Given distinct positive integers candidates and a target, return all unique multisets that sum to target. Each candidate may be used unlimited times.

Examples#

  • candidates = [2,3,6,7], target = 7[[2,2,3],[7]]

Constraints#

  • 1 <= n <= 30.

Approach#

DFS with start index. At each call, either reuse the current candidate (recurse with same start) or move past it (start + 1). Skip when remaining target is negative.

Solution#

Combination Sum
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> out;
vector<int> path;
function<void(int,int)> dfs = [&](int start, int remain) {
if (remain == 0) { out.push_back(path); return; }
for (int i = start; i < (int)candidates.size(); ++i) {
if (candidates[i] > remain) continue;
path.push_back(candidates[i]);
dfs(i, remain - candidates[i]); // reuse same i
path.pop_back();
}
};
dfs(0, target);
return out;
}
};

Editorial#

Passing i (not i + 1) on recursion is what allows reuse. The start parameter prevents duplicate multisets ([2, 3] vs [3, 2]).

Complexity#

  • Time: O(2^t) worst case.
  • Space: O(t) recursion.

Concept revision#

Search ESC

Keyboard shortcuts

Shortcuts are disabled while typing in inputs.