
方法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类的题目,这边有一个模版,我现在没看,复盘的时候要看明白。
- 如果你看到这道题,记住,下面的这些题要一起练习,我现在是按照顺序做的,复盘的时候这几题要一次行做完,然后总结归纳。

这篇博客探讨了一种使用回溯法解决组合问题的方法,特别是针对不允许重复元素的组合情况。作者提到了CombinationSum系列题目,并指出在避免重复列表时需要引入一个`start`参数,确保不添加已包含的节点到路径中。博客提供了详细的代码实现,并建议与其他相关回溯题目一起练习以加深理解。
5万+

被折叠的 条评论
为什么被折叠?



