Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
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], [] ]
这个题目与上个题目非常相似,只是增加了一个选择元素的过程。
因此可以直接使用dfs解决
java
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if (nums == null) {
return result;
}
if (nums.length == 0) {
result.add(new ArrayList<Integer>());
return result;
}
Arrays.sort(nums);
dfs(nums, 0, new ArrayList<Integer>(), result);
return result;
}
private void dfs(int[] nums,
int start,
List<Integer> path,
List<List<Integer>> result) {
result.add(new ArrayList<Integer>(path));
for (int i = start; i < nums.length; i++) {
if (i != start && nums[i] == nums[i - 1]) {
continue;
}
path.add(nums[i]);
dfs(nums, i + 1, path, result);
path.remove(path.size() - 1);
}
}
}
python
class Solution(object):
def subsetsWithDup(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if nums is None:
return []
if len(nums) == 0:
return [[]]
nums.sort()
result = []
self.dfs(nums, 0, [], result)
return result
def dfs(self, nums, start, path, result):
result.append(path[:])
for i in range(start, len(nums)):
if i != start and nums[i] == nums[i - 1]:
continue
path.append(nums[i])
self.dfs(nums, i + 1, path, result)
path.pop()