● 模板
1.思路
2.代码实现
● 39. 组合总和
1.思路
2.代码实现
class Solution {
List<List<Integer>> res= new ArrayList<>();
List<Integer> path= new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
backtracking(candidates, target,0,0);
return res;
}
public void backtracking(int[] candidates,int target, int sum, int startIndex){
if(sum>target){
return;
}
else if(sum==target)
{res.add(new ArrayList<>(path));
return;}
for(int i=startIndex;(i<candidates.length )&&(sum+candidates[i]<=target) ;i++){
path.add(candidates[i]);
sum+=candidates[i];
backtracking(candidates,target,sum,i);
sum-=candidates[i];
path.remove(path.size()-1);
}
}
}
● 40.组合总和II
1.思路
要注意题目要求结果不能重复,所以要做的是树层去重而不是树枝去重。因此引入了used数组来判断是否会产生重复结果。
2.代码实现
class Solution {
LinkedList<Integer> path = new LinkedList<>();
List<List<Integer>> ans= new ArrayList<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
boolean[] used= new boolean[candidates.length];
Arrays.fill(used,false);
Arrays.sort(candidates);
backtracking(candidates,target,0,0,used);
return ans;
}
public void backtracking(int[] candidates,int target,int sum, int startIndex,boolean[] used){
// System.out.println("backtracking"+sum);
//System.out.println("startIndex"+startIndex);
if(target<sum)
return;
if(target==sum)
{
ans.add(new ArrayList(path));
//System.out.println("ans");
return;
}
for(int i=startIndex;(i<candidates.length);i++){
if(sum+candidates[i]>target){
//System.out.println("sum+candidates[i]>target");
break;
}
if(i>0 && candidates[i]==candidates[i-1] && used[i-1]==false)
continue;
sum+=candidates[i];
used[i]=true;
path.add(candidates[i]);
//System.out.println(path);
backtracking(candidates,target,sum,i+1,used);
sum-=candidates[i];
used[i]=false;
path.removeLast();
}
}
}