#16
Backtracking
BacktrackingGiven distinct positive candidates and a target, return all unique combinations that sum to the target. A number may be reused unlimited times.
function combinationSum(candidates: number[], target: number): number[][] {
const res: number[][] = [];
const path: number[] = [];
const backtrack = (start: number, remaining: number): void => {
if (remaining === 0) { res.push([...path]); return; }
if (remaining < 0) return;
for (let i = start; i < candidates.length; i++) {
path.push(candidates[i]);
backtrack(i, remaining - candidates[i]); // i, not i+1: reuse allowed
path.pop();
}
};
backtrack(0, target);
return res;
}def combination_sum(candidates, target)
res = []
path = []
backtrack = lambda do |start, remaining|
if remaining.zero?
res << path.dup
return
end
return if remaining.negative?
(start...candidates.length).each do |i|
path.push(candidates[i])
backtrack.call(i, remaining - candidates[i]) # i, not i+1: reuse allowed
path.pop
end
end
backtrack.call(0, target)
res
end