题目描述
给定一个无重复元素的数组 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]
]
思路
可以采用回溯法暴力穷举和为 target
的数字组合,这很容易想到,但本题关键在于如何实现去重。
因为有 无重复元素 这一条件,所以如果要出现重复的话只可能是同一个位置的元素多次出现,而不用考虑其他位置出现相同字符。
那么在回溯的过程中,每次选择都允许重复选择当前的起始下标,即for循环中的 let i=start
,可以保证每个元素可以无限制重复被选取。
但是一旦起始下标已经越过了,则不能再回头访问到前面的元素,保证了在数组 path
中,相同的元素只能连续出现,实现去重。
var combinationSum = function(candidates, target) {
let res = [];
function dfs(start,path,target){
if(target < 0 ) return;
if(target === 0){
return res.push([...path]);
}
for(let i=start;i<candidates.length;i++){
let num = candidates[i];
path.push(num);
dfs(i,path,target-num);
path.pop();
}
}
dfs(0,[],target);
return res;
};