给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[ [7], [2,2,3] ]
这题是典型的回溯算法,需要注意的是题目的要求,解集不能包含重复的元素,也就是说,以示例1来说,不能出现[2,3,2]或者[3,2,2]
这种情况下可以通过提前对数组排序进行避免
解题思路是利用target做减法,当刚好可以等于0时,则说明前面的减数组成的集合一组解,当做减法后值为负数的时候,则表示该路径不通,使用回溯返回
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> listAll=new ArrayList<List<Integer>>();
List<Integer> list=new ArrayList<Integer>();
Arrays.sort(candidates);
method(listAll,list,candidates,0,target);
return listAll;
}
public void method(List<List<Integer>> listAll,List<Integer> list,int[] candidates,int start,int target){
//终止条件就是target==0
if (target<0){
return;
}else if(target==0){
listAll.add(list);
//将当前的集合赋值给listAll
return;
}
for (int i=start;i<candidates.length && candidates[i]<=target;i++){
//此处新定义了一个集合,将前面符合要求的集合的值赋给它,是为了避免集合中的值重复
List<Integer> tmp = new ArrayList<>(list);
tmp.add(candidates[i]);
method(listAll,tmp,candidates,i,target-candidates[i]);
}
}
}