LeetCode Day62 Subsets

递归,树的结构

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(),nums.end());
        vector<int> out;
        DFS(nums,0,out,res);
        return res;
    }
    void DFS(vector<int>& nums,int pos,vector<int>& out,vector<vector<int>>& res){
        res.push_back(out);
        for(int i=pos;i<nums.size();i++){
            out.push_back(nums[i]);
            DFS(nums,i+1,out,res);
            out.pop_back();
        }
    }
};

刚开始res只有一个空集,每次循环从nums中取一个数,然后遍历res现存的所有的项,先复制一下,再在复制的后面加上这个数。

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

*法三: 2 n 2^n
把数组中所有的数分配一个状态,true表示这个数在子集中出现,false表示在子集中不出现,那么对于一个长度为n的数组,每个数字都有出现与不出现两种情况,所以共有 2 n 2^n 中情况,那么我们把每种情况都转换出来就是子集了,我们还是用题目中的例子, [1 2 3]这个数组共有8个子集,每个子集的序号的二进制表示,把是1的位对应原数组中的数字取出来就是一个子集,八种情况都取出来就是所有的子集了,参见代码如下:

1 2 3 subset
0 F F F []
1 F F T 3
2 F T F 2
3 F T T 23
4 T F F 1
5 T F T 13
6 T T F 12
7 T T T 123
class Solution {
public:
    vector<vector<int> > subsets(vector<int> &S) {
        vector<vector<int> > res;
        sort(S.begin(), S.end());
        int max = 1 << S.size();
        for (int k = 0; k < max; ++k) {
            vector<int> out = convertIntToSet(S, k);
            res.push_back(out);
        }
        return res;
    }
    vector<int> convertIntToSet(vector<int> &S, int k) {
        vector<int> sub;
        int idx = 0;
        for (int i = k; i > 0; i >>= 1) {
            if ((i & 1) == 1) {
                sub.push_back(S[idx]);
            }
            ++idx;
        }
        return sub;
    }
};```

猜你喜欢

转载自blog.csdn.net/weixin_41394379/article/details/85417830