Leetcode Subsets II

题意:找到一个集合所有不一样的子集。

思路:暴力搜索。排序之后判断两个集合是否一样。

class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        int mark = pow(2.0, nums.size());
        vector<int> in;
        int iniin = 1;
        for(int i = 0; i < nums.size(); ++ i) {
            in.push_back(iniin);
            iniin <<= 1;
        }
        
        int ini = 0;
        vector<vector<int>> re;
        while(ini ^ mark) {
            vector<int> tempre;
            for(int i = 0; i < nums.size(); ++ i) {
                if(ini & in[i]) tempre.push_back(nums[i]);
            }
            ini ++;
            re.push_back(tempre);
        }
        vector<vector<int>> myre;
        
        for(int i = 0; i < re.size(); ++ i) {
            bool f = false;
            std::sort(re[i].begin(), re[i].end());
            for(int j = 0; j < myre.size(); ++ j) if(isSame(myre[j], re[i])) f = true;
            
            if(f == false) myre.push_back(re[i]);
        }
        
        return myre;
    }
    
    bool isSame(vector<int> a, vector<int> b) {
        if(a.size() != b.size()) return false;
        
        for(int i = 0; i < a.size(); ++ i) {
            if(a[i] != b[i]) return false;
        }
        return true;
    }
};


另一种方法是顺序插入,在原有的集合上出入新的元素得到新的集合,这是一种处理排列组合的常用方法。

class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<vector<int>> re = {{}};
        
        std::sort(nums.begin(), nums.end());
        for(int i = 0; i < nums.size();) {
            int count = 0;
            while(i + count < nums.size() && nums[i] == nums[i + count]) count ++;
            vector<int> temp;
            int size = re.size();
            for(int j = 0; j < size; ++ j) {
                temp = re[j];
                for(int k = 0; k < count; ++ k) {
                    temp.push_back(nums[i]);
                    re.push_back(temp);
                }
            }
            i += count;
        }
        
        return re;
    }
};


猜你喜欢

转载自blog.csdn.net/markpen/article/details/54628453