题目描述:
给定一个无重复元素的数组 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]
]
思路:
回溯算法
通过答案:
class Solution {
List<List<Integer>> res=new ArrayList(); //创建一个结果链表
public List<List<Integer>> combinationSum(int[] candidates, int target) {
if(candidates==null){ //如果列表为空,直接返回
return res;
}
dfs(target,0,new Stack<>(),candidates); //深度遍历
return res; //输出结果
}
private void dfs(int target,int index,Stack<Integer> stack,int[] candidates){
if(target==0){ //当target为0时,表示结果符合要求,将栈内元素加入结果列表
res.add(new ArrayList(stack));
return;
}
for(int i=index;i<candidates.length;i++){
if(candidates[i]<=target){
stack.push(candidates[i]); //元素入栈
dfs(target-candidates[i],i,stack,candidates);
stack.pop(); //每次回溯将最后一个元素删除
}
}
}
}