题目
给你一个整数数组 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;
}
};