打印一个含有重复元素数组的所有子集。例如:[1,2,2]的所有子集为[[],[1],[1,2],[1,2,2],[2],[2,2]]。
1、递归求解
List<List<Integer>> list=new ArrayList<List<Integer>>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<Integer> list1=new ArrayList<Integer>();
Arrays.sort(nums);
backTrack(0,nums,list1);
return list;
}
public void backTrack(int i,int[] nums,List<Integer> currentList){
list.add(currentList);
for(int j=i;j<nums.length;j++){
if(j==i || nums[j]!=nums[j-1]){
currentList.add(nums[j]);
backTrack(j+1,nums,new ArrayList<Integer>(currentList));
currentList.remove(currentList.size()-1);
}
}
}
2、直接求解
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
res.add(temp);
Arrays.sort(nums);
int l = 0, k;
for (int i = 0; i < nums.length; i++) {
if (i == 0 || nums[i] != nums[i-1])
l = res.size();
k = res.size();
for (int j = k-l; j < k; j++) {
temp = new ArrayList<>(res.get(j));
temp.add(nums[i]);
res.add(temp);
}
}
return res;
}