由于该题中无重复元素,因此不需要考虑树的一层中去重问题,
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> res=new ArrayList<>();
backtrack(res,new ArrayList<>(),candidates,target,0);
return res;
}
public void backtrack(List<List<Integer>> res,List<Integer> list,int[] candidates,int target,int start){
if(target==0){
res.add(new ArrayList<>(list));
return;
}
for(int i=start;i<candidates.length;i++){
if(target<candidates[i]){
continue;
}
list.add(candidates[i]);
backtrack(res,list,candidates,target-candidates[i],i);//i使得数字可以被无限制的选取
list.remove(list.size()-1);
}
}
}
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> result=new ArrayList<>();
Arrays.sort(candidates);
trackate(result,new ArrayList<>(),candidates,target,0);
return result;
}
public static void trackate(List<List<Integer>> result,List<Integer> cur,int[] candidates,int target,int start){
if(target==0){
result.add(new ArrayList<>(cur));
return;
}
for(int i=start;i<candidates.length;i++){
if(target<candidates[i])
{
continue;
}
if(i>start && candidates[i]==candidates[i-1]){//因为数组中允许重复的数,所以这里防止重复的组合
continue;
}
cur.add(candidates[i]);
trackate(result,cur,candidates,target-candidates[i],i+1);//i+1防止选择重复的数
cur.remove(cur.size()-1);
}
}
}