回溯算法
这是不含剪枝优化的回溯算法
function combinationSum(candidates: number[], target: number): number[][] {
const res: number[][] = [];
const dfs = (target: number, combine: number[], idx: number): void => {
if (idx === candidates.length) {
return;
}
if (target === 0) {
res.push(combine)
return;
}
// 直接跳过
dfs(target, combine, idx + 1)
// 选择当前数
if (target - candidates[idx] >= 0) {
dfs(target - candidates[idx], [...combine, candidates[idx]], idx)
}
}
dfs(target, [], 0);
return res;
};
回溯算法 + 剪枝
function combinationSum(candidates: number[], target: number): number[][] {
candidates.sort()
const res: number[][] = [];
const dfs = (target: number, combine: number[], idx: number): void => {
if (target === 0) {
res.push(combine)
return;
}
for(let i =idx; i < candidates.length; i++) {
if (target >= candidates[i]) {
dfs(target - candidates[i], [...combine, candidates[i]], i)
}
}
}
dfs(target, [], 0);
return res;
};