大致思路:回溯法+剪枝。
public class Solution {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
ArrayList<Integer> path = new ArrayList<>();
boolean used[];
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
if(num.length==0){
result.add(path);
return result;
}
Arrays.sort(num);
used = new boolean[num.length];
backtracking(num,0);
return result;
}
void backtracking(int[] num,int start){
result.add(new ArrayList<>(path));
if(start>=num.length) return ;
for(int i = start;i<num.length;i++){
if(i>0 && num[i]==num[i-1] && !used[i-1]) continue;
path.add(num[i]);
used[i] = true;
backtracking(num,i+1);
path.remove(path.size()-1);
used[i] = false;
}
}
}