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], []]
分析:
后加入的元素,需要加入全部已有的集合,并且考虑重复。
再次考虑S={1,2,2},先排序。
首先加入空集{}
对于元素1,需要加入{},成为新的集合{1}
对于元素2,需要加入{}和{1},成为新的集合{2}和{1,2}。考虑重复,再产生新集合{2,2}和{1,2,2}。
ac代码:
class Solution { public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<vector<int>> ret; vector<int>empty,newset; unordered_map<int,int>count; ret.push_back(empty); int i,j,L=nums.size(),L2,k; for(i=0;i<L;i++) count[nums[i]]++; sort(nums.begin(),nums.end()); vector<int>::iterator ite=unique(nums.begin(),nums.end()); nums.erase(ite,nums.end()); L2=nums.size(); for(i=0;i<L2;i++) { int s=ret.size(); for(j=0;j<s;j++) { newset=ret[j]; for(k=0;k<count[nums[i]];k++) { newset.push_back(nums[i]); ret.push_back(newset); } } } return ret; } };