1. 题目描述
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
- 所有数字(包括 target)都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入:candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
提示:
- 1 <= candidates.length <= 30
- 1 <= candidates[i] <= 200
- candidate 中的每个元素都是独一无二的。
-
2. 解题思路
这道题目和77题差不多,实现思路都是回溯+剪枝,唯一不一样的地方就是这里求得是所有组合的总和,我们初始化另一个sum保存当前还需要的总和的值,在递归的过程中,不断减少sum的值,直至最后和target相等,就将组合保存在结果中。
3. 代码实现
/**
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
var combinationSum = function(candidates, target) {
const res = []
let sum = 0
const dfs = (start, arr) => {
if(sum >= target){
if(sum === target){
res.push([...arr])
}
return
}
for(let i = start; i < candidates.length; i++){
sum += candidates[i]
arr.push(candidates[i])
dfs(i, arr)
sum -= candidates[i]
arr.pop()
}
}
dfs(0, [])
return res
};
4. 提交结果