前言>写此文章的主旨中心是为了给阅读的同学提供一个只有干货+实战的心得体会, 方便没有自己的学习路线的同学能够快速了解一些问题的核心以及解决问题的思路.
当然了这些内容也不是自己思考出来的,也是通过学习别人的内容总结归纳出来的,所以对于博主来说也是一个学习成长以及记录的过程, 有一些不足之处还请谅解, 希望大家都能共同进步, 汲取更多的知识, 早日找到中意的工作~
与二叉树相似, 回溯算法也有一套自己的解题的思路, 并且在回溯中通用,
解决回溯对应相关的问题, 通常我们需要明确:
1)路径: 即在一个选择情况下一直走到底的一种思路, 答案往往由无数的路径组合而成.
2)选择分支: 即路径每一次走下去 我们能够往路径中添加的接下来的内容.
3)结束条件: 即在每一次路径能够走到的极限位置, 到此回撤操作, 达成回溯.
对应的框架形式的代码可以如下:
基于以上思想, 我们以一个相对简单的问题来理解以上的思想.
比如 leetcode 46 全排列
1)首先题目明确说明 没有重复数字 所以无需考虑重复数字问题
2)我们需要做的事情即 依次在每一步选择一个数字 继续向前选择其他的数字 组成最终的一个完整路径 加入结果
所以明确:
路径: 单次的集合列表, 初始为空
选择分支: 没有被加入路径中的数字, 每次加入一个
结束条件: 当次路径中的个数 与 所有数字个数相等 加入结果集即可
代码如下:
明确以上思想, 我们再以一道相对复杂一些的问题, 再次复习一下此种思想
如: leetcode51 N皇后
题目要求n个棋子 放置在n*n的棋盘上 不可同行 不可同列 不可同一斜线
1)所以需要做的事情就是 每一行找到一个位置 放置一个棋子 同时保证不冲突
2)依次在每一行放置下棋子 如果放置到最后一行都没冲突 证明我们找到了其中一个结果
3)因为题目要求我们找到所有可能的放置结果 即需要将所有的排列方式遍历一次 正好明确我们的目标
路径: 每次在一行做放置棋子的操作
选择分支: 每行的不同列 都可以是我们尝试的放置位置
结束条件: 放置到最后一行没有冲突, 即为一种结果
代码如下: