代码随想录算法训练营第24天 [ 回溯算法基础 77. 组合]
一、回溯算法基础
链接: 代码随想录.
void backtracking(参数){
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
二、77. 组合
链接: 代码随想录.
思路:回溯模板
做题状态:看解析后做出来了
class Solution
{
public:
vector<int> path;
vector<vector<int>> result;
vector<vector<int>> combine(int n, int k)
{
backtracking(n, k, 1);
return result;
}
//确认函数和参数,start_index是用来去掉已经进入数组的元素
void backtracking(int n, int k, int start_index)
{
//终止条件
if (path.size() == k)
{
result.push_back(path);
return;
}
//单层处理逻辑 从start_index开始,函数递归中下一层的start_index是这一层i+1
for (int i = start_index; i <= n; i++)
{
path.push_back(i);
backtracking(n, k, i + 1);
//回溯
path.pop_back();
}
}
};