2020-05-27
1.题目描述
子集
2.题解
1.递归,集合中的每个数都面临着选与不选
2.使用二进制位的0/1来表示选/不选,假设集合中共有n个元素,1<<n表示一共有2^n种情况,对于每一种
情况,如果其二进制位上的值为1则表示添加进来。
3.代码
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> tmp;
int n=nums.size();
dfs(nums,tmp,0,0,n);
dfs(nums,tmp,1,0,n);
return res;
}
void dfs(vector<int> nums,vector<int> tmp,bool flag,int step,int n){
if (flag) tmp.push_back(nums[step]);
if (step<n-1){
dfs(nums,tmp,0,step+1,n);
dfs(nums,tmp,1,step+1,n);
}else{
res.push_back(tmp);
}
}
};
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
int l=nums.size();
for (int i=0;i<1<<l;i++){
vector<int> tmp;
for (int j=0;j<l;j++){
if ((i>>j)&1) tmp.push_back(nums[j]);
}
res.push_back(tmp);
}
return res;
}
};