LeetCode - Subsets

基本:

每一位要还是不要

解法一:non-recursion

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

解法二:recursion

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> out;
        gen(nums, 0, out, res);
        return res;
    }
    void gen(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]);
            gen(nums, i+1, out, res);    //要
            out.pop_back();              //不要
        }
    }
};

解法三:binary number

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> res;
        int max = 1<<nums.size();
        for(int i=0;i<max;i++){
            vector<int> out = convert(nums, i);
            res.push_back(out);
        }
        return res;
    }
    vector<int> convert(vector<int>& nums, int in){
        vector<int> res;
        int i=0;
        for(int k=in; k>0;k>>=1){
            if((k&1)==1){
                res.push_back(nums[i]);
            }
            i++;
        }
        return res;
    }

};

猜你喜欢

转载自blog.csdn.net/real_lisa/article/details/82931399