给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
这个题与78题子集的解题思路基本一致,这里的数组可以包含重复元素,所以第一种集合添加元素扩充的方法需要添加约束,之前是遇到新元素所有的原来的子集都复制一份添加新元素,这里如果遇到新的元素是相同的,那么只添加到上次添加过的那些子集即可。递归方法则是遇到相同元素时需要跳过递归。这里说的都必须是排好序的数组。因此这里还需要先进行排序。
C++源代码:
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
if(nums.empty()) return {};
vector<vector<int>> res(1);
sort(nums.begin(), nums.end());
int last = nums[0], size = 1;
for(int i=0;i<nums.size();i++){
if(nums[i]!=last){
last = nums[i];
size = res.size();
}
int newSize = res.size();
for(int j=newSize-size;j<newSize;j++){
res.push_back(res[j]);
res.back().push_back(nums[i]);
}
}
return res;
}
};
python3源代码:
class Solution:
def subsetsWithDup(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
out = []
nums.sort()
n = len(nums)
self.DFS(n, 0, nums, out, res)
return res
def DFS(self, n, level, nums, out, res):
res.append(copy.deepcopy(out))
i = level
while i < n:
out.append(nums[i])
self.DFS(n, i + 1, nums, out, res)
out.pop()
while i+1 < n and nums[i]==nums[i+1]:
i += 1
i += 1