给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
解题方法:回溯,深度遍历数组(排序后的数组),遍历节点时先判断当前值如果当前值大于target,就跳出本循环(而不是本次循环)
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> res = new ArrayList<>();
if (candidates == null || candidates.length == 0){
return res;
}
Deque<Integer> path = new ArrayDeque<>();
Arrays.sort(candidates);
dfs(0,candidates,target,path,res);
return res;
}
private void dfs(int begin, int[] candidates, int target, Deque<Integer> path, List<List<Integer>> res) {
if (target == 0){
res.add(new ArrayList<>(path));
}
for (int i = begin; i < candidates.length; i++) {
if (target - candidates[i] < 0){
break;
}
path.add(candidates[i]);
dfs(i,candidates,target-candidates[i],path,res);
path.removeLast();
}
}