给定一个无重复元素的数组 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 中的每个元素都是独一无二的。
1 <= target <= 500
分析:该题还是使用回溯法进行解决,需用一个idx记录寻找的candidaes的第几个,对于每个idx,可以选择这个数,也可以不选择这个数,如果选择这个数,下一次的idx还是idx,而不是idx+1,因为题目说明candidates中的数字可以无限制重复被选取,这点是需要注意的!
class Solution {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
List<Integer> t = new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
dfs(candidates,target,0);
return ans;
}
public void dfs(int[] can,int target,int idx){
if(target < 0){
return ;
}else if(target == 0){
ans.add(new ArrayList<Integer>(t));
return;
}else if(idx == can.length){
return ;//直接结束
}
//不用idx这个数
dfs(can,target,idx + 1);
//用这个idx数
t.add(can[idx]);//将这个数加入这个选择中
dfs(can,target-can[idx],idx);
//撤销这个选择
t.remove(t.size() - 1);
}
}