携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
题目描述
给定一个整数数组nums,数组里的元素互不相同,要求返回该数组的所有子集,注意,在这里空集是所有集合的子集。
例1:输入:nums=[2,8,9] 输出:[[2,8,9],[2,8],[2,9],[2],[8,9],[8],[9],[]]
本题值得注意的地方
- 对所返回的子集的顺序不做要求,可以是任意顺序。
- 注意空集的情况
- 所返回的子集不能有重复的
原题地址:78. 子集
解题思路
这种寻找所有符合要求的子集类型的题目可以使用深搜来解决,没搜索到一个元素的位置的时候,我们可以做出的选择有选择该元素与不选择该元素。
如上面例1所给的输入为例,我们默认当搜索到一个位置时,先选择该元素作为子集,然后继续向下搜索,当这种情况搜索完成后,此时将我们所有得到的结果存储到一个指定的变量中去,然后再去搜索不选择该元素作为子集的情况。
这里我们在搜索时用一个变量m来标识此刻我们所要操作的元素的位置。用vecror来存储选择的元素,选择当前元素这种情况递归完成后,把当前元素从vector中移除,再去递归不选择该元素的情况。
实现代码
class Solution {
public:
// 存储所有的子集
vector<vector<int>> res;
void dfs(vector<int>& nums,vector<int>& vec,int m){
// 若当前要操作的位置超过所给数组的最大索引,则将该种选择情况的子集加入res中
if(m==nums.size()){
res.push_back(vec);
return ;
}
// 选择该元素作为子集后
vec.push_back(nums[m]);
dfs(nums,vec,m+1);
// 不选择该元素作为子集
vec.pop_back();
dfs(nums,vec,m+1);
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> vec;
dfs(nums,vec,0);
return res;
}
};