给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
输入:candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
抛砖引玉
思路
本题原前面day-08: 组合 (难度:中等)逻辑基本一致
只是组合种是选定k个元素,本题是要求元素和为target,本题新增的特性允许元素重复
区别引起的逻辑变化:
递归:
/**
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
var combinationSum = function(candidates, target) {
let _result = []
function dfs(i, item, sum) {
if (i >= candidates.length) return
if (sum === target) {
_result.push(item)
return
}
dfs(i + 1, item, sum)
if (target - sum - candidates[i] >= 0) {
// 注意一个元素可以重复出现,则索引位不变
dfs(i, [...item, candidates[i]], sum + candidates[i])
}
}
dfs(0, [], 0)
return _result
};