回溯算法模板
回溯算法可以抽象为一个多叉树问题。
void backtracking(各种参数) {
结束条件;
for(对同一层节点进行遍历) {
处理当前节点;
递归函数,处理下一层节点;
将当前的节点删除,恢复到进入循环之前的现场,为同层下一个节点处理做准备;
}
}
题目链接:77.组合
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<int> vec;
vector<vector<int>> result;
int i = 1;
backtracking(i, n, vec, result, k);
return result;
}
void backtracking(int i, int n, vector<int>& vec, vector<vector<int>>& result, const int& k) {
if(vec.size() == k) {
result.push_back(vec);
return;
}
for(; i <= n; i++) {
vec.push_back(i);
backtracking(i + 1, n, vec, result, k);
vec.pop_back();
}
}
};
对该问题剪枝:
当vec里面存储的数量与省下所有可能值的数量加起来都没有k大的时候可以直接结束函数,改变循环函数的终止条件。
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<int> vec;
vector<vector<int>> result;
int i = 1;
backtracking(i, n, vec, result, k);
return result;
}
void backtracking(int i, int n, vector<int>& vec, vector<vector<int>>& result, const int& k) {
if(vec.size() == k) {
result.push_back(vec);
return;
}
for(; vec.size() + n - i + 1 >= k; i++) {
vec.push_back(i);
backtracking(i + 1, n, vec, result, k);
vec.pop_back();
}
}
};