剪枝之前:
public static List<List<Integer>> combinationSum(int[] candidates, int target){
List<List<Integer>> res=new ArrayList<>();
if(candidates.length==0||candidates==null) return res;
Deque<Integer> path=new ArrayDeque<>();
dfs(candidates,0,target,path,res);
return res;
}
public static void dfs(int[] candidates, int begin, int target, Deque<Integer> path, List<List<Integer>> res){
if(target<0) return;
if(target==0){
//因为后续path还会有变化,直接传入res会导致res中的值不准确
res.add(new ArrayList<>(path));
return;
}
for(int i=begin;i<candidates.length;i++){
path.addLast(candidates[i]);
dfs(candidates,i,target-candidates[i],path,res);
path.removeLast();
}
}
剪枝之后:
public static List<List<Integer>> combinationSum(int[] candidates, int target){
List<List<Integer>> res=new ArrayList<>();
if(candidates.length==0||candidates==null) return res;
Deque<Integer> path=new ArrayDeque<>();
Arrays.sort(candidates);
dfs(candidates,0,target,path,res);
return res;
}
public static void dfs(int[] candidates, int begin, int target, Deque<Integer> path, List<List<Integer>> res){
if(target==0){
//因为后续path还会有变化,直接传入res会导致res中的值不准确
res.add(new ArrayList<>(path));
return;
}
for(int i=begin;i<candidates.length;i++){
//剪枝,不满足条件的直接break,因为后面的数会更大
if(target-candidates[i]<0) break;
path.addLast(candidates[i]);
dfs(candidates,i,target-candidates[i],path,res);
path.removeLast();
}
}