LeetCode OJ:Subsets

来源:互联网 发布:淘宝老店新开的利弊 编辑:程序博客网 时间:2024/06/06 04:00

Subsets

Given a set of distinct integers, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,
If S = [1,2,3], a solution is:

[  [3],  [1],  [2],  [1,2,3],  [1,3],  [2,3],  [1,2],  []]


递归:

增量构造法:

class Solution {public:void dfs(vector<int> &S,int start,vector<int> &path,vector<vector<int>> &result){        result.push_back(path);        for(int i=start;i<S.size();i++){            if(i!=start&&S[i]==S[i-1])continue;            path.push_back(S[i]);            dfs(S,i+1,path,result);            path.pop_back();        }    }    vector<vector<int> > subsets(vector<int> &S) {        vector<vector<int>> result;        vector<int> path;        sort(S.begin(),S.end());        dfs(S,0,path,result);        return result;    }};

class Solution {public:    vector<vector<int> > subsets(vector<int> &S) {        vector<vector<int>> result;        vector<int> path;        sort(S.begin(),S.end());        subsets(S,path,0,result);        return result;    }private:    static void subsets(vector<int> &S,vector<int> &path,int step,vector<vector<int>> &result){        if(step==S.size()){            result.push_back(path);            return;        }        //不选        subsets(S,path,step+1,result);        //选        path.push_back(S[step]);        subsets(S,path,step+1,result);        path.pop_back();    }};

位向量法:

class Solution {public:    vector<vector<int> > subsets(vector<int> &S) {        vector<vector<int>> result;        vector<bool> selected(S.size(),false);        sort(S.begin(),S.end());        subsets(S,selected,0,result);        return result;    }private:    static void subsets(vector<int> &S,vector<bool> &selected,int step,vector<vector<int>> &result){        if(step==S.size()){            vector<int> subset;            for(int i=0;i<S.size();i++)                if(selected[i])subset.push_back(S[i]);            result.push_back(subset);            return;        }        //不选        selected[step]=false;        subsets(S,selected,step+1,result);        //选        selected[step]=true;        subsets(S,selected,step+1,result);    }};

迭代

增量构造法

class Solution {public:    vector<vector<int> > subsets(vector<int> &S) {        vector<vector<int>> result(1);        sort(S.begin(),S.end());                for(auto elem : S){            result.reserve(result.size()*2);            auto half = result.begin()+result.size();            copy(result.begin(),half,back_inserter(result));            for_each(half,result.end(),[&elem](decltype(result[0]) &e){              e.push_back(elem);              });        }        return result;    }};

二进制法:

此方法最为巧妙

class Solution {public:    vector<vector<int> > subsets(vector<int> &S) {        vector<vector<int>> result;        sort(S.begin(),S.end());        const size_t n=S.size();        vector<int> v;                        for(size_t i=0;i<1<<n;i++){            for(size_t j=0;j<n;j++){                if(i&1<<j)v.push_back(S[j]);            }            result.push_back(v);            v.clear();        }                return result;    }};



0 0