40. 组合总和 II(包含重复数字)
第一次还申请了一个used[]数组,借鉴了全排列去重的思路。
看了题解才知道,排序后只要判断i>begin就行了,妙啊。
放过不同层级的相同数字,不放过同一层级的相同数字,具体解释在评论区:
class Solution {
LinkedList<List<Integer>> ans=new LinkedList<>();
LinkedList<Integer> path=new LinkedList<>();
//boolean[] used;
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
//used=new boolean[candidates.length];
Arrays.sort(candidates);
dfs(candidates,target,0);
return ans;
}
void dfs(int[] candidates,int target,int begin){
if(target==0){
ans.add(new LinkedList(path));
return;
}
if(target<0)return;
for(int i=begin;i<candidates.length;i++){
//if(i>0&&candidates[i]==candidates[i-1]&&!used[i-1])
if(i>begin&&candidates[i]==candidates[i-1])//去重关键。
continue;
//if(!used[i]){
path.add(candidates[i]);
//used[i]=true;
dfs(candidates,target-candidates[i],i+1);//下次不用选这个,这里是i+1
//used[i]=false;
path.removeLast();
//}
}
}
}
这道题用二叉树的形式怕是很难精简。

浙公网安备 33010602011771号