[leetcode]78. 子集
程序员文章站
2022-04-04 11:14:21
...
DFS:
class Solution {
public:
vector<vector<int>>ans;
vector<vector<int>> subsets(vector<int>& nums) {
int n = nums.size();
vector<int>path;
ans.push_back(path);
for(int i = 1; i <= n; i++)
dfs(nums,path,0,n,i);
return ans;
}
void dfs(vector<int>&nums,vector<int>&path,int start,int n,int k)
{
if(k == 0)
{//k代表剩几个
ans.push_back(path);
return;
}
for(int i = start; i < n; i++)
{
path.push_back(nums[i]);
dfs(nums,path,i+1,n,k-1);
path.pop_back();
}
}
};
bitmasking
解题思路
因为n个元素的集合有2^n
子集(包括空集和全集),因为在组成一个子集的时候,每一个元素都有被取过来或者不被取过来两种可能,因此,n
个元素的集合就有2^n
个不同的构造子集的方法,也就是,它一共有2^n
个不同的子集,包括空集和全集在内。空集与全集如果不考虑的话,就剩下2^n-2
个非空真子集。
假设掩码由n
位二进制位组成,掩码对应的二进制的第i位为1表示,它对应的子集包含nums
数组里的第i
个数字(从0
开始)
nums = [1,2,3]
mask | binary | subset |
---|---|---|
0 | 000 | |
1 | 001 | 1 |
2 | 010 | 2 |
3 | 011 | 1,2 |
4 | 100 | 3 |
5 | 101 | 1,3 |
6 | 110 | 2,3 |
7 | 111 | 1,2,3 |
代码
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n=nums.size();
vector<vector<int>>res((1<<n));
for(int mask = 0; mask < (1<<n); mask++)
{
for(int i = 0; i < n; i++)
{
if(mask&(1<<i)) // is the i-th bit of this mask 1?
{//This mask corresponds to a subset containing i-th number of nums array
res[mask].push_back(nums[i]);
}
}
}
return res;
}
};
我写的英文版的:
上一篇: 第一节 练习15
下一篇: Leetcode 78. 子集