给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解法一:每个数字有选和不选两种情况,用1表示选择该数,0表示不选,那么每一种情况都对应着二进制下0~2^n-1中的一个数。通过位运算就可以得到每种情况下应该要选择的数,自然就得到了答案。
解法二:递归求解。每次递归都考虑是否选择当前这个数。
class Solution {
public:
vector<int> tmp;
vector<vector<int>> ans;
vector<vector<int>> subsets(vector<int>& nums) {
// 解法一
// int n=nums.size();
// int mask=0;
// int end=pow(2,n)-1;
// while(mask<=end){
// int tmp_mask=mask;
// for(int i=0;i<n;i++){
// if(1 & (tmp_mask>>i)){
// tmp.push_back(nums[i]);
// }
// }
// ans.push_back(tmp);
// tmp.clear();
// mask++;
// }
// return ans;
//解法二
dfs(0,nums);
return ans;
}
void dfs(int pos,vector<int>& nums){
if(pos == nums.size()){
ans.push_back(tmp);
return;
}
tmp.push_back(nums[pos]);
dfs(pos+1,nums);
tmp.pop_back();
dfs(pos+1,nums);
}
};