出去玩了几天 ,上午先把 5.6 号的三个题目又做了一遍,对递归有了新的体会,自己写的时候每道题都会有一点小问题,然后看题解,发现就是大体思路有但是会有些注意不到或者没考虑到的,总的来说新的一边真的是会有新的理解。后面就要补之前的了
回溯理论基础:
回溯搜索法是纯暴力搜索算法;
回溯法解决的问题:组合;切割问题;子集问题;排列问题;棋盘问题
回溯法一般抽象成N叉书
回溯算法模板:
void backtracking(参数) {
if(终止条件) {
收集结果;
return;
}
for(集合元素) {
处理节点;
递归函数;
回溯操作; (撤销操作)
}
return value;
}
回溯三部曲:确定递归函数参数返回值;确定终止条件;单层递归逻辑
看完视频之后写这个还可以。
class Solution {
public:
vector<int> path;
vector<vector<int>> reslut;
void backtracking(int n, int k, int startindex) {
if(path.size() == k) {
reslut.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 reslut;
}
};
剪枝优化,是在for循环里,对i做限制,即可