思路:这是之前子集的延伸,不过这次允许有重复项。拿题目中的例子[1 2 2]来分析,根据子集的分析,当处理到第一个2时,此时的子集合为[], [1], [2], [1, 2],而这时再处理第二个2时,如果在[]和[1]后直接加2会产生重复,所以只能在上一个循环生成的后两个子集合后面加2。所以我们用last来记录上一个处理的数字,然后判定当前的数字和上面的是否相同,若不同,则循环还是从0到当前子集的个数(此时newsize-size=0);若相同,则新子集个数减去之前循环时子集的个数当做起点来循环,这样就不会产生重复了。
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int> > ans(1);
sort(nums.begin(),nums.end());
int last=nums[0],size=1;
for(int i=0;i<nums.size();++i)
{
if(last!=nums[i])
{
last=nums[i];
size=ans.size();
}
int newsize=ans.size();
for(int j=newsize-size;j<newsize;++j)
{
ans.push_back(ans[j]);
ans.back().push_back(nums[i]);
}
}
return ans;
}
};