原题地址:https://leetcode-cn.com/problems/subsets/description/
题目描述:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
解题方案:
第一次使用位运算的方法解题,对于本题,采用位运算的方法真的很方便。若nums的长度为n,则遍历2n2n次,每次得到一个子集:
- 将i看成二进制码流,判断j位是0还是1,如果为1,则选中nums[j]添加到子集中,从而得到一个子集vec
- 将子集vec保存进res
- 返回res
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n = nums.size();
int all = 1 << n;
vector<vector<int>> res;//存放最后的结果
for(int i = 0; i < all; i++){
vector<int> vec;
for(int j = 0; j < nums.size(); j++){
if((i & (1 << j)) != 0){
vec.push_back(nums[j]);
}
}
res.push_back(vec);
}
return res;
}
};
采用回溯法,也可以解决本题。从pos处开始遍历数组nums:
- 将nums[i]压栈进入路径path
- 将path压栈进入result
- 递归调用subsets_dfs(nums,i+1,path,result)
- pop path出栈,剔除nums[i],
class Solution {
public:
void dfs(vector<int>& nums, int pos, vector<int>& path, vector<vector<int>>& result)
{
if(pos == nums.size()) return;
for(int i = pos; 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;
}
};