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],
[]
]
题意:给出一个数组,数组中可能包含重复元素,求这个数组的所有不重复子集。
思路:这道题是subsets的followup,增加的条件是数组中会出现重复元素,但是返回的子集不能允许重复。比如[1,2,2],1和两个2都可以组成子集,但是只能返回一个,所以关键在于遇到重复元素时的处理。既然选哪个2和1组成的子集都一样,我们就可以定下一个规则,对于所有重复元素,我们只选择第一次出现的那个。另外,题目没有说明数组已排序,所以别忘了先排序,再搜索。
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if (nums == null || nums.length == 0) {
return res;
}
Arrays.sort(nums);
dfs(nums, 0, new ArrayList<>(), res);
return res;
}
private void dfs(int[] nums, int start, List<Integer> subres, List<List<Integer>> res) {
res.add(new ArrayList<>(subres));
for (int i = start; i < nums.length; i++) {
//遇到重复元素,并且自己不是第一个就不选了
if (i > start && nums[i] == nums[i-1]) {
continue;
}
subres.add(nums[i]);
dfs(nums, i + 1, subres, res);
subres.remove(subres.size() - 1);
}
}