给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
思路
在上一个子集的基础上,先对数组排序,在push进result之前,先insert进set集合,即可保证子集不重复
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
result.push_back(item);
digui(0,nums,item,result);
return result;
}
private:
vector<int> item;
vector<vector<int>> result;
set<vector<int>> retSet;//去重
void digui(int n,vector<int>& nums,vector<int>& item,vector<vector<int>>& result){
if(n>=nums.size()){
return;
}
item.push_back(nums[n]);
if(retSet.find(item)==retSet.end()){
result.push_back(item);
retSet.insert(item);
}
digui(n+1,nums,item,result);
item.pop_back();
digui(n+1,nums,item,result);
}
};