Leetcode 90 子集IIC++

思路:这是之前子集的延伸,不过这次允许有重复项。拿题目中的例子[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;
        
        
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43387999/article/details/87464932