题目:
Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
Elements in a subset must be in non-descending order.The solution set must not contain duplicate subsets.
For example,
If S = [1,2,2], a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
思路:
增加了一行去重的代码
Code:
ArrayList<List<Integer>> al;
ArrayList<Integer> sub;
int[] n;
public List<List<Integer>> subsetsWithDup(int[] num) {
al = new ArrayList<List<Integer>>();
sub = new ArrayList<Integer>();
n=num;
Arrays.sort(n);
for(int i=0; i<=num.length; i++){
dfs(0,i);
}
return al;
}
public void dfs(int start, int deep){
if(deep==0) {al.add(new ArrayList<Integer>(sub)); return;}
for(int i=start; i<n.length;i++){
if(i!=start && n[i]==n[i-1]) continue; //去重代码
sub.add(n[i]);
dfs(i+1,deep-1);
sub.remove(sub.size()-1);
}
}
备注:
去重代码:
if(i!=start && n[i]==n[i-1]) continue;
这里不可以用 i != 0 判断,会使得有duplicate number的list 无法添加
用 i != start 判断,允许了第一次出现的 duplicate number 添加到list上,同时拒绝多次出现的 dn,很巧妙