算法训练营 第二十四天
新篇章之回溯算法day01~
回溯算法理论基础
回溯算法就是在递归的基础上加入了回退的操作。是一种暴力解法,适用于需要遍历所有可能情况的题型。
比如:排列组合问题、切割问题、子集问题、棋盘问题等
回溯问题的解题三部曲:
- 回溯函数模板的返回值及参数
- 回溯函数的终止条件
- 回溯函数的单步逻辑
77.组合
这道题就是典型的在递归的基础上加了回溯的操作。
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(int n, int k, int startIndex) {
if (path.size() == k) {
result.push_back(path);
return;
}
for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) { // 优化的地方
path.push_back(i); // 处理节点
backtracking(n, k, i + 1);
path.pop_back(); // 回溯,撤销处理的节点
}
}
public:
vector<vector<int>> combine(int n, int k) {
backtracking(n, k, 1);
return result;
}
};