题目:
给定⼀个⽆重复元素的无序数组 arr 和⼀个⽬标数 target ,找出 arr 中所有数字总和为 target 的组合。arr 中的数字可以⽆限制重复被选取。
示例:
输⼊: arr = [2,3,5], target = 8,输出:[[2,2,2,2],[2,3,3],[3,5]]
解题思路:回溯思想
要点:
- 注意回溯中对象的地址传参引起的联动修改问题
- 拷贝出一个新的对象
- 手动进行回溯,还原该对象的原始值
//组合总和
function combinationSum(arr, target) {
const res = [];
backtrack(arr, target, 0, 0, res, []);
return res;
}
function backtrack(arr, target, start, sum, res, list) {
//剪枝
if (sum > target) return;
//符合条件
if (sum === target) {
// 拷贝之后再push,才能在修改list时不影响结果数组
return res.push([...list]);
}
// sum<target
// i=start+1表示不允许重复选取
for (let i = start; i < arr.length; i++) {
list.push(arr[i]);
backtrack(arr, target, i, sum + arr[i], res, list);
// 回溯至上一层时手动pop
list.pop(arr[i]);
}
}
补充: sum和target可以整合成一个参数remain,然后判断remain和0的大小关系