目前打算刷些算法题,数据结构的题暂时放一放吧。
39.组合总和
不会,毕竟好久没做回溯了。
看了这个图会好理解很多呦。
class Solution {
List<List<Integer>> ans=new ArrayList<>();
List<Integer> list=new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
int n=candidates.length;
Arrays.sort(candidates);
back(candidates,target,0,n,0);
return ans;
}
public void back(int[] candidates,int target,int index,int n,int sum){
if(sum==target){
ans.add(new ArrayList<>(list));
这里要对list转型才能调用add函数。
return ;
}
for(int i=index;i<n;i++){
if(sum+candidates[i]>target) break;
else{
list.add(candidates[i]);
back(candidates,target,i,n,sum+candidates[i]);
list.remove(list.size()-1);
}
}
}
}
40.组合总和Ⅱ
可以做,这题和上题比,有个细节就是解集不能包含重复元素。
class Solution {
List<List<Integer>> ans=new ArrayList<>();
List<Integer> list=new ArrayList<>();
public void back(int[] candidates,int index,int target){
if(0==target){
ans.add(new ArrayList<>(list));
return;
}
for(int i=index;i<candidates.length;i++){
if(i>index&&candidates[i]==candidates[i-1])
continue;
这样就能保证没有重复解集。
if(0>target)break;
list.add(candidates[i]);
back(candidates,i+1,target-candidates[i]);
list.remove(list.size()-1);
}
}
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
back(candidates,0,target);
return ans;
}
}