LeetCode 78. Subsets

方法一:Backtracing (DFS)

非常典型的回溯,必须烂熟于心。

class Solution {
public:
    vector<vector<int>> res;
    
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<int> cur;
        dfs(nums,0,cur);
        return res;
    }
    
    void dfs(vector<int>& nums, int index, vector<int> &cur){
        res.push_back(cur);
        for (int i=index;i<nums.size();++i){
            cur.push_back(nums[i]);
            dfs(nums,i+1,cur);
            cur.pop_back();
        }
    }

 

方法二:迭代

把当前的结果vector里的所有元素 都加上当前的元素 push_back

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

 

方法三:Bit Manipulation

https://leetcode.com/problems/subsets/discuss/27278/C++-RecursiveIterativeBit-Manipulation

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        int n = pow(2, nums.size()); 
        vector<vector<int>> subs(n, vector<int>());
        for (int i = 0; i < nums.size(); i++) {
            for (int j = 0; j < n; j++) {
                if ((j >> i) & 1) {
                    subs[j].push_back(nums[i]);
                }
            }
        }
        return subs;
    }
};

 

posted @ 2018-08-24 12:15  約束の空  阅读(94)  评论(0)    收藏  举报