法一:递归
class Solution {
public:
//使用递归和回溯的思想实现
vector<vector<int>> result;
void generate(vector<int> nums, vector<int> tmp,int i){
if(i>= nums.size()) return;
//不添加当前数字
generate(nums, tmp, i+1);
tmp.push_back(nums[i]);
//添加当前数字,只有集合更新了,才需要添加到result集合里面
result.push_back(tmp);
generate(nums, tmp ,i+1);
return;
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> tmp;
int i = 0;
result.push_back(tmp);
if(nums.size()==0) return result;
generate(nums,tmp,i);
return result;
}
};
法二:for循环
class Solution {
public:
//用for循环的方式实现
//每个数选与不选,共有2^n种可能
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> result;
int all = 1<< nums.size();//用一位表示一个数字,1<<nums.size()即为2^n
for(int i=0; i<all; i++){
vector<int> item;
for(int j=0; j<nums.size(); j++){
//相当于100000...(共j个0,二进制)
//和2^n个i与各位分别相与,如果i!=0,则表示选中该位
if(i&(1<<j)){
item.push_back(nums[j]);
}
}result.push_back(item);
}
return result;
}
};