Leetcode Subsets II

来源:互联网 发布:淘宝刻章违法吗 编辑:程序博客网 时间:2024/06/16 16:17

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

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

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;    }};


0 0
原创粉丝点击