39. 组合总和
难度:中等
标签:回溯算法
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
思路:
可以先排序,然后通过深度优先选择数组的中的数,每个数可以重复选,直到大于目标值,排好序的,如果大于了,后面的就不用再选了,回来的时候,需要删除这个数,然后把和也减去,之前添加的数
public List<List<Integer>> combinationSum(int[] candidates, int target){
Arrays.sort(candidates);
List<List<Integer>> lists=new ArrayList<>();
ArrayDeque<Integer>path=new ArrayDeque<>();
int thisSum=0;
int pos=0;
dfs(pos,lists,candidates,target,path,thisSum);
return lists;
}
private void dfs(int pos,List<List<Integer>>lists, int[] candidates, int target, ArrayDeque<Integer> path, int thisSum) {
if(thisSum==target){
lists.add(new ArrayList<>(path));
return;
}
for(int i=pos;thisSum<target&&i<candidates.length;i++){
thisSum+=candidates[i];
path.addLast(candidates[i]);
if(thisSum>target) {
thisSum-=candidates[i];
path.removeLast();
break;
}
dfs(i,lists,candidates,target,path,thisSum);
thisSum-=candidates[i];
path.removeLast();
}