题目
给定一组不同的整数 nums,返回所有可能的子集(幂集)。
注意事项:该解决方案集不能包含重复的子集。
例如,如果 nums = [1,2,3],结果为以下答案:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解析
这题可以直接用DFS来做,比较直接,也相对简单。还可以考虑用位运算,将i
转换成二进制,1对应的位置就是选中的位置,如果len=nums.size()
,则最多有len
位,既数字最大为pow(2,len)-1
,举例如下:
nums={1,2,3}
,则
1=001(2)
1
=
001
(
2
)
,表示选中1,
2=010(2)
2
=
010
(
2
)
,表示选中2,
3=011(2)
3
=
011
(
2
)
,表示选中1,2
…
以此类推。pow(2,len)=1<<len
,用位运算,加快速度
DFS
class Solution {
public:
void dfs(vector<int> &nums,int idx,vector<vector<int>> &res,vector<int> &path){
for(int i=idx;i<nums.size();i++){
path.push_back(nums[i]);
res.push_back(path);
dfs(nums,i+1,res,path);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> path;
res.push_back(path);
dfs(nums,0,res,path);
return res;
}
};
位运算
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int len=nums.size();
int n=1<<len;
vector<vector<int>> res;
for(int i=0;i<n;i++){
vector<int> tmp;
for(int j=0;j<len;j++){
if((i&(1<<j))>0) tmp.push_back(nums[j]);
}
res.push_back(tmp);
}
return res;
}
};