36 lines
963 B
JavaScript
36 lines
963 B
JavaScript
/**
|
||
* @param {number[]} candidates
|
||
* @param {number} target
|
||
* @return {number[][]}
|
||
*/
|
||
const combinationSum = function (candidates, target) {
|
||
|
||
};
|
||
|
||
/*
|
||
利用回溯算法解决,每一次都尝试从candidates的当前位置开始向后依次加入path。
|
||
如果path中所有值的和等于target就收集结果,
|
||
如果大于就回溯尝试下一个元素,直到把结果收集完毕,返回result。
|
||
*/
|
||
function f1(candidates, target) {
|
||
const result = [];
|
||
|
||
// 回溯函数增加一个 start 参数,用于控制递归选择的起始位置
|
||
const backtrack = (start, path, sum) => {
|
||
if (sum > target) return;
|
||
if (sum === target) {
|
||
result.push([...path]);
|
||
return;
|
||
}
|
||
|
||
for (let i = start; i < candidates.length; i++) {
|
||
path.push(candidates[i]);
|
||
backtrack(i, path, sum + candidates[i]); // 允许重复选当前数,所以递归从 i 开始
|
||
path.pop();
|
||
}
|
||
};
|
||
|
||
backtrack(0, [], 0);
|
||
return result;
|
||
}
|