Leetcode: Subsets

来源:互联网 发布:云智能网络 编辑:程序博客网 时间:2024/06/01 10:37

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:    vector<vector<int> > subsets(vector<int> &S) {        vector<vector<int> > result;        if (S.empty()) return result;                sort(S.begin(), S.end(), greater<int>());        int size = S.size();        int max_sets = pow(2, size);        for (int i = 0; i < max_sets; ++i) {            result.push_back(getElement(S, size, i));        }    }        vector<int> getElement(vector<int> &S, int size, int index) {        vector<int> elem;        for (int i = 1; index > 0; ++i) {            if (index & 1) {                elem.push_back(S[size-i]);            }            index >>= 1;        }                return elem;    }};


===================第二次======================

DFS标准解法,简单,不容易出错, 面试必备。

class Solution {public:    vector<vector<int> > subsets(vector<int> &S) {        vector<vector<int>> result;        vector<int> subset;                sort(S.begin(), S.end());        subsets_util(result, subset, S, 0);                return result;    }        void subsets_util(vector<vector<int>> &result, vector<int> &subset, const vector<int> &S, int step) {        if (step == S.size()) {            result.push_back(subset);            return;        }                subsets_util(result, subset, S, step+1);                subset.push_back(S[step]);        subsets_util(result, subset, S, step+1);        subset.pop_back();    }};

简单优化一下最开始的解法:

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


0 0
原创粉丝点击