文章目录
题目
回溯:78. 子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同
代码
cpp
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<int>tmp;
vector<vector<int>>res;
dfs(nums,0,tmp,res);
return res;
}
void dfs(vector<int>&nums,int path_len,vector<int>&tmp,vector<vector<int>>&res){
if(path_len==nums.size()){
res.push_back(tmp);
return ;
}
tmp.push_back(nums[path_len]);
dfs(nums,path_len+1,tmp,res);//递归
tmp.pop_back();//递归结束
dfs(nums,path_len+1,tmp,res);
}
};
原理图

原理解释
提示:算法流程及解释在代码中已标注
方法:通过决策树进行穷举
原始问题可以划分为子问题,叫做递归。同时又有状态的改变,这种有状态改变的递归叫做回溯。
注意:
回溯法 = 带 "撤销选择" 的深度优先搜索
回溯一定是 DFS
DFS 不一定是回溯
1、边界条件:搜索路径的长度等于数组长度,就说明搜索完一条路径找到了一个子集,存储到结果数组中,接着往上回溯搜素下一条路径(return)
2、把当前路径长度对应的数组保存到tmp数组中
3、接着递归下去
4、递归结束需要恢复tmp状态,tmp状态就是对应了每个节点的状态
两个dfs:第一个 pushback +dfs选择当前元素 第一种选择
第二个dfs不选当前元素 第二种选择