78题是子集I,没有重复数字,本题有重复数字
    考虑方式相似,不同的地方就是要去处理那些重复的数字

    首先要去想的是:重复的数字在什么地方才能出现?
    答:在已经出现过的地方才能出现,在没有出现过的地方只能出现那个领头的数字
    因此,代码可以从78题修改至如下:

    1. class Solution {
    2. public:
    3. vector<vector<int>> subsetsWithDup(vector<int>& nums) {
    4. vector<vector<int>> res = {{}};
    5. sort(nums.begin(), nums.end());
    6. int start = 0;
    7. for(int i = 0; i < nums.size(); i++)
    8. {
    9. start = (i && nums[i] == nums[i - 1])?start:0;
    10. int len = res.size();
    11. for(int j = start; j < len; j++)
    12. {
    13. auto tmp = res[j];
    14. tmp.push_back(nums[i]);
    15. res.push_back(tmp);
    16. }
    17. start = len;
    18. }
    19. return res;
    20. }
    21. };

    第二种想法
    我们去想一下,把重复的数字看成一个整体,然后想一下,它的可能性:都不出现,出现一个,出现两个…出现k个

    1. class Solution {
    2. public:
    3. vector<vector<int>> subsetsWithDup(vector<int>& nums) {
    4. vector<vector<int>> res = {{}};
    5. sort(nums.begin(), nums.end());
    6. for(int i = 0; i < nums.size(); i++)
    7. {
    8. int same = 1;
    9. while(i + 1 < nums.size() && nums[i + 1] == nums[i])
    10. {
    11. same++;
    12. i++;
    13. }
    14. int len = res.size();
    15. for(int j = 0; j < len; j++)
    16. {
    17. auto tmp = res[j];
    18. for(int k = 0; k < same; k++)
    19. {
    20. tmp.push_back(nums[i]);
    21. res.push_back(tmp);
    22. }
    23. }
    24. }
    25. return res;
    26. }
    27. };

    第二次写题

    class Solution {
    public:
        vector<vector<int>> subsetsWithDup(vector<int>& nums) {
            sort(nums.begin(), nums.end());
            vector<vector<int>> res = {{}};
            int cnt = 1;
            for(int i = 0; i < nums.size(); i++)
            {
                if(i + 1 < nums.size() && nums[i + 1] == nums[i]) 
                {
                    cnt++;
                    continue;
                }
                int len = res.size();
                for(int j = 0; j < len; j++)
                {
                    auto tmp = res[j];
                    for(int k = 1; k <= cnt; k++)
                    {
                        tmp.push_back(nums[i]);
                        res.push_back(tmp);
                    }
                }
                cnt = 1;
            }
            return res;
        }
    };
    

    第三次写题
    这里主要注意的是怎么处理重复的

    class Solution {
    public:
        vector<vector<int>> subsetsWithDup(vector<int>& nums) {
            sort(nums.begin(), nums.end());
            vector<vector<int>> res = {{}};
            int len = res.size();
            for(int i = 0; i < nums.size(); i++)
            {
                int start = (i > 0 && nums[i] == nums[i - 1])? len : 0;
                len = res.size();
    
                for(int j = start; j < len; j++)
                {
                    auto tmp = res[j];
                    tmp.push_back(nums[i]);
                    res.push_back(tmp);
                }
            }
            return res;
    
        }
    };