回溯法理论基础
1、解决问题:
(1)组合问题
(2)切割问题:问切割一种字符串,使子串都是回文子串,有多少种切割方式
(3)子集问题
(4)排列问题
(5)棋盘问题:N皇后、解数独
2、回溯法模板:
//回溯法模板
void backtracking(参数){
//递归终止条件
if(终止条件){
收集结果;
return;
}
for(集合元素){
处理元素;
递归;
回溯;
}
}
77.组合
1、关键:易错点—回溯 path.pop_back();
2、代码:
class Solution {
private:
vector<int> path;
vector<vector<int>> res;
public:
//回溯法
void backtracking(int n, int k, int StartIndex){
//递归终止条件
if(path.size()==k){
res.push_back(path);//保存结果
return;
}
for(int i = StartIndex; i<=n; i++){
path.push_back(i); //处理集合元素
backtracking(n, k, i+1); //递归
path.pop_back(); //回溯
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(n, k, 1);
return res;
}
};