回溯:
1.先声明好大集合和小集合,在调用回溯函数,终止条件为sum==target,要进行剪枝操作减少遍历的次数,去重操作防止数组中有两个相同的值来组成的集合相同。
java
class Solution {
List<List<Integer>> li1=new ArrayList<List<Integer>>();
List<Integer> li2=new ArrayList<Integer>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
//接收计算总和
int sum=0;
//方便去重操作
Arrays.sort(candidates);
huisu(candidates,target,0,sum);
return li1;
}
public void huisu(int[] candidates,int target,int Index,int sum){
//终止条件
if(sum==target ){
li1.add(new ArrayList<>(li2));
return ;
}
//遍历和剪枝操作
for(int i=Index;i<candidates.length&&sum+candidates[i]<=target;i++){
//去重操作
if (i>Index&&candidates[i]==candidates[i-1]){
continue;
}
//加入集合li2中
li2.add(candidates[i]);
sum+=candidates[i];
//嵌套
huisu(candidates,target,i+1,sum);
//回溯操作
sum-=li2.get(li2.size()-1);
li2.removeLast();
}
}
}