题目链接:点击这里
递归:
class Solution {
public:
void dfs(int idx, vector<int>& nums, vector<int>& tmp, vector<vector<int>>& ans)
{
if(idx>=nums.size())
{
ans.push_back(tmp);
return;
}
tmp.push_back(nums[idx]);
dfs(idx+1, nums, tmp, ans);
tmp.pop_back();
dfs(idx+1, nums, tmp, ans);
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ans; //记录最终结果
vector<int> tmp; //记录中间结果
dfs(0, nums, tmp, ans);
return ans;
}
};
二进制位角度:
一个包含 个元素的集合 ,它的子集有 , , , , …, , … , 共 个。
例如 的集合 ,它的子集和二进制数的对应关系是:
- 每个子集对应一个二进制数;
- 这个二进制数中的每个 ,都对应了这个子集中的某个元素。
- 子集的数量是 个,因为所有二进制数的总个数是 。
代码中可能用到的位运算如下:
1<<n
即i&(1<<j)
即判断 的第 位是否为
可以通过处理二进制中的 来打印所有的子集:
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
using namespace std;
void print_subset(int n)
{
//i:0~2^n, 每个i的二进制数对应一个子集,一次打印一个子集,最后得到所有子集
for(int i = 0; i < (1<<n); i++)
{
for(int j = 0; j < n; j++)
if(i&(1<<j)) //判断i的第j位是否为1
cout<<j<<" ";
cout<<endl;
}
}
int main()
{
int n;
cin>>n;
print_subset(n);
return 0;
}
AC代码如下:
class Solution {
public:
void print_subset(vector<int>& nums, vector<vector<int>>& ans)
{
int n = nums.size();
//i: 0 ~ 2^n, 每个i的二进制数对应一个子集,一次打印一个子集,最后得到所有子集
for(int i = 0; i < (1<<n); i++)
{
vector<int> tmp;
for(int j = 0; j < n; j++)
if(i&(1<<j)) //判断i的第j位是否为1
tmp.push_back(nums[j]);
ans.push_back(tmp);
}
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ans;
print_subset(nums, ans);
return ans;
}
};