LeetCode刷题_c++版-90子集二

与78子集的思想类似,多了判断是否重复的部分
https://blog.csdn.net/weixin_44343355/article/details/128800102

class Solution {
    
    
public:
    vector<vector<int>> result;

    //此处集合要加上引用
    void generate(vector<int> nums, vector<int> tmp, set<vector<int>>& res_set, int i){
    
    
        if(i == nums.size()) return;
        generate(nums, tmp, res_set, i+1);
        tmp.push_back(nums[i]);
        //如果该子集未重复
        if(res_set.find(tmp) == res_set.end()){
    
    
            res_set.insert(tmp);
            result.push_back(tmp);
        }
        generate(nums, tmp, res_set, i+1);
        return;
    }

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
    
    
        //先对集合进行排序,升序
        vector<int> tmp;
        result.push_back(tmp);
        if(nums.size() == 0) return result;

        sort(nums.begin(), nums.end(), less<int>());
        //确保集合中的各元素是升序的,以防集合1为[1,2,2],集合2为[2,1,2],但集合不判为相等的情况
        int i = 0;
        
        set<vector<int>> res_set;//用于去重,set去重所用时间复杂度为logN
        res_set.insert(tmp);//集合的底层存贮结构为键值对
        generate(nums, tmp, res_set, i);
        return result;
    }
};

在这里插入图片描述
指标不咋的,欢迎各位大佬批评指正!

猜你喜欢

转载自blog.csdn.net/weixin_44343355/article/details/128810049