子集

题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

 

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:

输入:nums = [0]
输出:[[],[0]]

思路

记nums的长度为n。nums每一位数字有在子集与不在子集两种状态,共有2n种组合,

即2n个子集。遍历2n种组合,即可得到所有的子集。用0表示nums[i]不

在子集,1表示nums[i]在子集。则每一种组合都是一个二进制数,并且二进制数的范围为大于等于0,

小于等于2n-1。对于第i位的1来说,可以按位与1<<i得到结果,第i为1,其他都是0都是0

的结果。如果这个结果不为0,则把第i位的数字放入子集。

代码

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> ans;
        //遍历所有组合
        for(int i = 0;i < pow(2,n);i++) {
            vector<int> tmp;
            for(int j = 0;j < n;j++) {
                //把当前组合里的1放入子集
                if (i & (1<<j)) {
                    tmp.emplace_back(nums[j]);
                }
            }
            ans.emplace_back(tmp);
        }
        return ans;
    }
};