
原题链接
- 回溯算法
- 首先定义list结果数组,以及path用于路径的保存
- 进入recur递归函数后,首先设定截止条件,当sum == target的时候,就将当前的path保存到list中
- 开始for循环,套用回溯的模板,首先判断一下 sum + candidates[i] > target是否成立,若成立则,直接break
- 然后将candidates[i] addLast进入path,之后进入下一层的递归
- 注意:在下一层的递归中,传入的sum 是 sum + candidates[i] ,而且开始的位置是 i ,而不是 index
- 最后将之前的操作撤销 (removeLast)
- 二刷:思路和之前的相似,在递归之前先往sum 中添加值,然后往path中addlast值,递归之后撤销
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> list = new ArrayList<>();
Deque<Integer> path = new ArrayDeque<>();
Arrays.sort(candidates);
recur(list, path, candidates, target, 0, 0);
return list;
}
public void recur(List<List<Integer>> list, Deque<Integer> path, int[] candidates, int target, int sum ,int index){
if(sum == target){
list.add(new ArrayList<>(path));
return;
}
for(int i = index; i < candidates.length; i++){
if(sum + candidates[i] > target) break;
path.addLast(candidates[i]);
recur(list, path, candidates, target, sum + candidates[i], i);
path.removeLast();
}
}
}