原题链接78. 子集 - 力扣(LeetCode)
这是一道暴力搜索问题参考大佬们的题解,对这类题目做出一下总结
1.确定递归参数变量
2.递归结束条件
3.做出选择,递归调用进入下一层
4.回溯,返回到递归前的状态
要完成前面这几步有一个重要的前提条件,你要确定采用什么样式的递归,这个来源于解题经验,
这道题采用顺序递归(我想的名字),举个例子,1,2,3,如果我先选了1,那么按照从左到右的顺序剩下的子集里可选的就是2,3,我下面要从2,3当中选一个,如果选2,那么按照从左到右的顺序,下面可选的子集就只有3.
如果我选3呢,那么按照从左到右的顺序,剩下的子集里就没有可选的了,因为从左到右吗,2被我们跳过了,选了3之后就该选3后面的
class Solution {
private: vector<vector<int>>res;
void backtrack(vector<int>num,vector<int>& ans,int start)
{//终止条件
res.push_back(ans);//这里在最开始的时候压入了一个空集合
for (int i = start; i < num.size(); i++)
{
ans.push_back(num[i]);
backtrack(num, ans, i + 1);
ans.pop_back();//弹出最后一个元素,就是我们刚才压入的元素
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<int>ans;
backtrack(nums, ans, 0);
return res;
}
};