提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
题目原型在此:
给你一个 无重复元素 的整数数组 candidates
和一个目标整数 target
,找出 candidates
中可以使数字和为目标数 target
的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates
中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target
的不同组合数少于 150
个。
我的分析:
这题的回溯和dfs有难度,怎样保证没有重复答案,因为是按数组顺序遍历,程序执行的过程去除了重复,另外:Deque的实现类是ArrayDeque和LinkedList等,没有ArrayList,他的加入和删除方法是addLast() removeLast()等,有add() 。
新写的dfs方法的返回值类型是void,只要传过来res,就可以。本解法将数组排序,更有利于判断target-的条件。回溯就是dfs里的先加入节点,递归后,再减去这个节点。
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
int len=candidates.length;
List<List<Integer>> res=new ArrayList<>();
if(len==0){
return res;
}
Arrays.sort(candidates);
Deque<Integer> path=new ArrayDeque<>();
dfs(candidates,0,path,res,target);
return res;
}
public void dfs(int[] candidates, int begin,Deque<Integer> path,List<List<Integer>> res,int target){
if(target==0){
res.add(new ArrayList<>(path));
return;
}
int len=candidates.length;
for(int i=begin;i<len;i++){
if(target-candidates[i]<0){
break;
}
path.add(candidates[i]);
dfs(candidates,i,path, res, target-candidates[i]);
path.removeLast();
}
}
}