代码随想录算法训练营第二十四天 | 回溯算法

209 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

回溯算法

什么是回溯算法

百度百科上这样定义:

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。

递归伴随着回溯,只要有递归就会有回溯。

回溯算法的效率

由于回溯的本质就是穷举,需要穷举所有的可能,然后选出需要的答案,所以回溯算法并不高效,即使进行了剪枝的操作,回溯算法也很低效。但是有一些问题一定要用回溯法来解决。

回溯算法解决的问题

  1. 组合问题:N个数里面按一定规则找出k个数的集合
  2. 切割问题:一个字符串按一定规则有几种切割方式
  3. 子集问题:一个N个数的集合里有多少符合条件的子集
  4. 排列问题:N个数按一定规则全排列,有几种排列方式
  5. 棋盘问题:N皇后,解数独等等

这些问题都是很困难的问题,回溯法解决的问题可以理解为树形结构,通过不断的分解子集,最终得出结果。这个分解的过程就像是构造树的过程。

回溯算法模板

在二叉树的递归算法中,我们总结了递归的三要素,对于回溯我们也可以总结出三个要素:

  1. 回溯函数模板返回值以及参数

回溯算法中,一般没有函数的返回值。参数需要在题目的分析中确定。

  1. 回溯函数终止条件

终止条件一般是搜索到叶子节点,将答案存起来,结束本次递归。

  1. 回溯搜索的遍历过程

回溯搜索的遍历过程就是使用for循环横向遍历使用递归纵向遍历。这样可以遍历到整个树形结构。