回溯backtracking
确定回溯函数参数
确定终止条件
确定单层遍历逻辑
- 函数返回值一般为void
- 和递归是相辅相成的
- 只要又递归就有回溯
- 递归结束后向次级函数回退的过程
- 通常抽象成一个n叉树
组合
在于没有顺序 例如1 2有两种组合
切割
一个字符串按一定规则有几种切割方式
子集
排列
与组合相比有顺序
棋盘
N皇后,解数独等等
回溯函数遍历过程伪代码
for (选择:本层集合中元素(集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
回溯算法模板框架如下:
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
add/push remove/removeLast/pop/poll
path.add(i);
path.removeLast();
path.add(candidates[i]);
path.remove(path.size()-1);
path.push(i);
path.poll();
path.push(i);
path.pop();
树层上去重(更好)
(used[i - 1] == false)
树枝上去重
(used[i - 1] == true)
n皇后们的约束条件
- 不能同行
- 不能同列
- 不能同斜线
棋盘的宽度就是for循环的长度,递归的深度就是棋盘的高度
Arrays.fill()
Arrays.fill(给哪个需要赋值的东西,赋的值是多少);
解数独
- 同行是否重复
- 同列是否重复
- 9宫格里是否重复