题目
给定一组不同的整数 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;
}
};

本文介绍了一种生成整数集合所有子集的算法,包括使用深度优先搜索(DFS)和位运算两种方法。通过具体实例说明了如何利用这两种方法找到给定整数集合的所有可能子集,并确保结果中不包含重复的子集。

463

被折叠的 条评论
为什么被折叠?



