Skip to content

M78.子集

backtracking, https://leetcode.cn/problems/subsets/

思路:和 M46.全排列 相似,将上题递归函数的“== nums.size()”换成for(int k = 0 ; k < nums.size() ; k++) 即可,其余对应稍加修改即可。

思路:最棒的思路就是利用二进制关系,每个数字只有0/1两个状态,某一个子集中,那么这个子集就一共有2^n个,然后利用二进制枚举来实现,同样也可以进行递归考虑问题,也是每个位置进行0/1两种状态dfs,然后记录长度输出即可

cpp
class Solution {
public:
    vector<int> t;
    vector<vector<int>> ans;

    vector<vector<int>> subsets(vector<int>& nums) {
        int n = nums.size();
        for (int mask = 0; mask < (1 << n); ++mask) {
            t.clear();
            for (int i = 0; i < n; ++i) {
                if (mask & (1 << i)) {
                    t.push_back(nums[i]);
                }
            }
            ans.push_back(t);
        }
        return ans;
    }
};