跳转至

78.子集 (Medium)*

题目描述*

标签*

回溯算法;

思路 & 代码*

回溯,只不过加入到结果集的条件改变。

还可以用位运算,用位标记元素是否在子集中出现。

class Solution {
private:
    vector<vector<int>> res;
    int n;
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        n = nums.size();
        if(n == 0) {
            return {{}};
        }
        vector<int> path;
        backtrack(nums, 0, path);
        return res;
    }
    void backtrack(vector<int>& nums, int idx, vector<int>& path) {
        res.push_back(path);
        for(int i = idx; i < n; i++) {
            path.push_back(nums[i]);
            backtrack(nums, i + 1, path);
            path.pop_back();
        }
    }
};
class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> res;
        int n = nums.size();
        int len = 1 << n;
        for(int i = 0; i < len; i++) {
            vector<int> tmp;
            for(int j = 0; j < n; j++) {
                if((i >> j) & 1) {
                    tmp.push_back(nums[j]);
                }
            }
            res.push_back(tmp);
        }   
        return res;
    }
};

最后更新: July 23, 2022