回溯法:nums[1,2,3],可以对数字1,2,3选择进行处理,数字1,我们有两个选择,放进集合中或者不在集合中;
class Solution {
public:
void dfs(vector<int>& nums,int index,vector<int>& path,vector<vector<int>>& result)
{
if(index == nums.size()) return ;
for(int i = index;i < nums.size();++i)
{
//放进集合中
path.push_back(nums[i]);
result.push_back(path);
dfs(nums,i+1,path,result);
//不放进集合
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> result;
vector<int> path;
result.push_back(path); //存入空子集
if(nums.empty()) return result;
dfs(nums,0,path,result);
return result;
}
};
位运算:nums[1,2,3],共有2的三次方个子集 = 8;
有几个数字,将数字1左移多少位,nums中有3个数字,左移3次 = 8;
进行与运算(&) 比较;
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
int n = nums.size(); //3
int all = 1<<n; //8
for(int i = 0;i < all;++i)
{
vector<int> vec;
for(int j = 0;j < n;++j)
{
if((i & (1 << j)) != 0)
{
vec.push_back(nums[j]);
}
}
res.push_back(vec);
}
return res;
}
};