用01序列代表子集
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n=nums.size();
vector<vector<int>> result;
vector<int> condition;
for(int mask=0;mask<(1<<n);mask++){//每个序列代表一种子集
condition.clear();
for(int j=0;j<n;j++){
if(mask & (1<<j)){//01序列的每一位对比是否是1
condition.push_back(nums[j]);//如果是1,第i个数字加入
}
}
result.push_back(condition);
}
return result;
}
};
经典回溯
class Solution {
public:
vector<vector<int>> result;
vector<int> condition;
vector<vector<int>> subsets(vector<int>& nums) {
int n=nums.size();
backtrack(nums,0,n);
return result;
}
void backtrack(vector<int>& nums,int curr,int n){
if(curr==n){
result.push_back(condition);
return ;
}
if(curr<n){
condition.push_back(nums[curr]);
backtrack(nums,curr+1,n);
condition.pop_back();
backtrack(nums,curr+1,n);
}
}
};