基本:
每一位要还是不要
解法一:non-recursion
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
res.push_back({});
for(int i=0;i<nums.size();i++){
int s = res.size();
for(int j=0;j<s;j++){
res.push_back(res[j]);
res[j].push_back(nums[i]);
}
}
return res;
}
};
解法二:recursion
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> out;
gen(nums, 0, out, res);
return res;
}
void gen(vector<int>& nums, int pos, vector<int>& out, vector<vector<int>>& res){
res.push_back(out);
for(int i=pos;i<nums.size();i++){
out.push_back(nums[i]);
gen(nums, i+1, out, res); //要
out.pop_back(); //不要
}
}
};
解法三:binary number
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
int max = 1<<nums.size();
for(int i=0;i<max;i++){
vector<int> out = convert(nums, i);
res.push_back(out);
}
return res;
}
vector<int> convert(vector<int>& nums, int in){
vector<int> res;
int i=0;
for(int k=in; k>0;k>>=1){
if((k&1)==1){
res.push_back(nums[i]);
}
i++;
}
return res;
}
};