题解:
回溯三部曲:
1、确定回溯函数参数
void backtracking(vector<int>& nums,int startIndex)
2、确定递归终止条件
剩余集合为空时,即停止 ,也即startIndex ==nums.size()时,停止
3、确定单层搜索过程
for循环控制横向遍历,递归纵向遍历,记录每一个遍历的结点加入结果集
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums,int startIndex){
//终止条件
if(startIndex == nums.size()){
return;
}
//单层搜索过程
for(int i = startIndex;i<nums.size();i++){
path.push_back(nums[i]);
result.push_back(path);
backtracking(nums,i+1);
path.pop_back();
}
return;
}
vector<vector<int>> subsets(vector<int>& nums) {
//空集是任何集合的子集
result.push_back(path);
backtracking(nums,0);
return result;
}
};
子集问题,是收集树形结构中树的所有节点的结果
组合问题和分割问题是收集树形结构中叶子结点的结果
附上代码讲解录讲解图,便于理解: