原题链接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;}
};