方法1: 和Combination Sum系列其他题目一样,也是backtracking。然后这边唯一需要注意的一个点是不能有duplicate的list(list内部顺序不同,但是数字完全相同也被认为是duplicate)出现在答案中,这就有点像Combination Sum 2了,需要引进一个start参数,我们每次是不能添加前面的node到当前的path中去的,因为这会导致duplicate。这道题就这个点比较难理解,复盘的时候再仔细看下lc的官方解释。
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
dfs(candidates, target, 0, res, path);
return res;
}
public void dfs(int[] candidates, int target, int start, List<List<Integer>> res, List<Integer> path){
if(target == 0){
res.add(new ArrayList<>(path));
return;
}
if(target < 0) return;
for(int i = start; i < candidates.length; i++){
path.add(candidates[i]);
dfs(candidates, target - candidates[i], i, res, path);
path.remove(path.size()-1);
}
}
}
总结:
- 关于backtracking类的题目,这边有一个模版,我现在没看,复盘的时候要看明白。
- 如果你看到这道题,记住,下面的这些题要一起练习,我现在是按照顺序做的,复盘的时候这几题要一次行做完,然后总结归纳。