要求:幂集
思路:
法一:可以对每个长度循环回溯,但是没必要循环,只要中间所有vector都放进来即可
class Solution {
public:
vector<vector<int>> v;
vector<int> tmp;
void dfs(vector<int>& nums,int start){
v.push_back(tmp);
if(tmp.size()==nums.size())return;
for(int i=start;i<nums.size();++i){
tmp.push_back(nums[i]);
dfs(nums,i+1);
tmp.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
dfs(nums,0);
return v;
}
};
法二:设nums有n位,幂集2的n次个,每个对应一个n位二进制数,哪一位为1表示nums[i]在集合里。可以用2的i次方和n位二进制数相与判断在不在
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> v;
vector<int> tmp;
int n=nums.size();
for(int bin=0;bin<(1<<n);++bin){
tmp.clear();
for(int i=0;i<n;++i)
if(bin&(1<<i))tmp.push_back(nums[i]);
v.push_back(tmp);
}
return v;
}
};