LeetCode(Subsets)

来源:互联网 发布:小猪cms源码2017 编辑:程序博客网 时间:2024/04/20 07:08

Subsets
深搜:

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

二进制法:
前提:集合元素个数不超过int位数(32位)

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

Subsets II
深搜:

class Solution {public:    vector<vector<int> > subsetsWithDup(vector<int> &S) {        sort(S.begin(),S.end());        vector<vector<int> > result;        vector<int> path;        dfs(S,result,path,0);        return result;    }    //考虑以S[i]开头的选择方案    void dfs(vector<int> &S,vector<vector<int> > &result,vector<int> &path,int i)    {        result.push_back(path);        for(int j=i;j<S.size();++j)        {            if(j>i&&S[j]==S[j-1])continue;            path.push_back(S[j]);            dfs(S,result,path,j+1);            path.pop_back();        }    }};

二进制法:
前提:集合元素个数不超过int位数(32位)

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