1. 内容
- 回溯解法:暴力搜索的一种,可以掉头的递归。以子集生成代码为例,从函数调用角度,通过一张图,理解回溯法是如何通过递归实现的。
- 在递归出口和递归部分的两处位置,分别实现将子集存入结果中。
2.子集生成中的回溯解法 – 递归出口处存储结果
题目见力扣第78题子集。该解法的中心思想是,对给定集合中的元素,在子集中只有两种可能:出现或者不出现。因此,对每个元素逐个进行放入item和不放入item操作,来模拟子集的生成过程。当最一个元素的操作完成时,自然要结束所有的操作,程序返回。因此,可以得到子集生成回溯法的解空间树(见图1)和递归的出口设计是:递归到最后一个元素, 直接返回;
![](https://img-blog.csdnimg.cn/20200503133131379.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5MjU3MA==,size_30,color_FFFFFF,t_70#pic_center)
图1 回溯法子集生成的解空间
程序代码如下(为了画图方便,将递归函数命名为g()):
class Solution
{
public:
vector<vector<int>> subsets(vector<int>& nums)
{
vector<vector<int> > res;
vector<int> item;
g(0, nums, item, res);
return res;
}
private: