问题:
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
解决:
① 输入数组允许有重复项,其他条件都不变,代码只需在原有的基础上增加一句话,while (nums[i] == nums[i + 1]) i ++; 这句话的作用是跳过树中为X的叶节点,因为它们是重复的子集,应被抛弃。
class Solution { //3ms
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums == null || nums.length == 0) return res;
List<Integer> list = new ArrayList<>();
Arrays.sort(nums);
dfs(nums,0,list,res);
return res;
}
public void dfs(int[] nums,int i,List<Integer> list,List<List<Integer>> res){
res.add(new ArrayList<Integer>(list));
for (int j = i;j < nums.length ;j ++ ) {
if(j > i && nums[j] == nums[j - 1]) continue;
list.add(nums[j]);
dfs(nums,j + 1,list,res);
list.remove(list.size() - 1);
}
}
}