78.子集
基本思想:在每个子集中,nums中的每个元素都有“出现”和“不出现”两种可能,因此每个子集都可以表示为一棵二叉树中根节点到叶节点的路径。
方法一:DFS:搜索所有的从根节点到叶节点的路径即可得到所有子集。
方法二:回溯:搜索解空间并进行剪枝。
class Solution {
public:
//1.dfs
void dfs(vector<vector<int>>& res,vector<int>& nums,vector<int>& subset,int level){
if(level==nums.size()){
res.push_back(subset);
return;
}
subset.push_back(nums[level]);
dfs(res,nums,subset,level+1);
subset.pop_back();
dfs(res,nums,subset,level+1);
return;
}
//2.回溯
void backtracking(vector<vector<int>>& res,vector<int>& nums,vector<int>& subset,int level){
if(level<=nums.size()){
res.push_back(subset);
}
for(int i=level;i<nums.size();i++){
subset.push_back(nums[i]);
backtracking(res,nums,subset,i+1);
subset.pop_back();
}
return;
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>>res;
vector<int>subset;
//dfs(res,nums,subset,0);
backtracking(res,nums,subset,0);
return res;
}
};
来源:CSDN
作者:天花板上飞着鱼
链接:https://blog.csdn.net/qq_24367797/article/details/103857859