前言

回溯算法是一个非常经典的算法,像图中的DFS(深度优先遍历)其核心思想就是回溯,但是初学者对于回溯总是感觉一头雾水,不知所措,但熟不知,回溯算法也是尤其“套路”的

原创声明

本人在学习回溯算法时也感觉比较困惑,但是有幸看到一本非常好的算法书籍,也算是解决了我很多疑惑,我发现有些东西不是我智商不够,而是缺乏训练,尤其是有目的,有逻辑的训练。
本文皆是我在阅读它的书后所做的一些整理,发表一下自己的看法。如果有兴趣的小伙伴可以移步

labuladong的算法小抄

题目

一:回溯算法的本质和框架(结合全排列)

(1)回溯算法的本质

回溯算法本质是一个暴力穷举的过程,你会发现涉及回溯算法的题目都有一个共同特点:列出所有满足的情况
而且做得多了,你也会有种感觉,就是每个能用回溯算法解决的题目总能画出一个二叉树来,比如LeetCode 46:全排列这就是一道打开回溯算法大门的经典题,而它对应的二叉树是这样的

在回溯算法中,我们称这样的树为决策树,解决一个回溯问题,其实就是一个决策树的遍历过程

(2)回溯算法的框架

遍历整个决策树时,你只需要思考三个问题:

  • 路径:你已经做出的选择
  • 选择列表:也就是你当前可以做的选择
  • 结束条件:到达决策树底层,无法再做选择的条件

以全排列为例:说明上面的含义,全排列的决策树如下

完成全排列,这三个位置的数字是不能够重复的,所以假如你站到了根节点上,你就可以做出决策了,你现在可以选择1或2或3,为什么呢,因为刚开始你还没有做出选择;好的现在你做出了选择,选择了2,也就是到达了红色的结点,那么你现在的路径就是2,它记录了你已经做出的选择,现在你可以选择1或3,那么它就是你的选择列表;,然后当你走的树的最底层时你会发现你没得选择,于是你到达了结束条件,同时此时的选择列表为空

现在我们可以拿出回溯算法的框架了,解决回溯算法类的题目时,你只需要按照这种角度去思考,不能保证一定能解出来,但是至少能保证已经非常接近正确答案了。至少能保证,你看见某个题目,即使你想不出来,但是你知道应该怎么去靠近正确解法,因为能不能解出来,最重要的还是要靠你的理解能力。

下面result通常设为一个全局变量,用于返回结果,前面我们就说过,回溯算法本质就是在遍历决策树,所以那个backtrack其实就是在实现这样的需求,下面的for循环时在做出选择,然后再进行backtrack递归。需要注意的是做选择做出的是合理的选择,就拿全排列而言,做选择时一定要选择在选择列表中不属于路径的元素,通俗的讲就是你已经选择了2,然后再选择时候就不能选择2了,只能选择1或3了

result = []
def backtrack(路径, 选择列表):if 满足结束条件:result.add(路径)returnfor 选择 in 选择列表:做选择backtrack(路径, 选择列表)撤销选择

上面的框架中,有一点我相信大家是肯定有疑惑的,那就是为什么要撤销选择
前面我们就说过,回溯算法本质就是在遍历决策树,那么新的问题又来了:如何遍历?如何遍历我就不用说了,我要特别强调的是它的本质,因为很多人老是按照“左中右”,“左右中”这种方式去记忆树的遍历,无法体会到其精髓。
就拿前序和后序来说,你能说出其本质是什么吗?本质就是它是进入某个结点之前就行执行操作还是离开某个结点之后再执行操作的问题

大家可以想一想,你的一次选择结束了,你肯定要返回当当时进入递归时的状态,然后进行另外的选择啊,不然你不返回状态,其他选择怎么办。如果不撤销,按照上图的角度,你只会得到一个结果,就是用于遍历的左子树。

好的至此,基本的问题就讲清楚了,我相信大家肯定还有诸多疑惑,但是没有关系,做完全排列你就会读回溯有了新的理解

【README】回溯算法基本框架相关推荐

  1. 回溯算法之电话号码的字母组合

    解法框架 [README]回溯算法基本框架 电话号码的组合(点击跳转) 对于这道题,很明显涉及到的也是回溯算法.但是这道题有一特别之处,就是它的选择列表给的不明显,回想全排列那道题目,其选择列表给出的 ...

  2. 回溯算法之幸运的袋子

    解法框架 [README]回溯算法基本框架 幸运的袋子(点击跳转) 这道题基本也是回溯,题解中有一部分提到了dfs,其实dfs本质也是回溯算法.这道题有点特别,除了考察算法外,还轻微涉及一点数学知识, ...

  3. 回溯算法之全排列问题

    解法框架 [README]回溯算法基本框架 全排列问题(点击跳转) 首先我们需要仔细观察函数的返回值和形参等(这里我使用的C++,因为它处理数组,字符串特别方便),这里形参是一个vector的引用,也 ...

  4. 回溯法遵循深度优先吗_闲来刷下「回溯算法」

    定义 ❝ 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向 ...

  5. 五大常用经典算法—回溯算法

    原文作者:labuladong 原文地址:回溯算法套路详解 读完本文,你可以去力扣拿下如下题目: 46.全排列 51.N皇后 解决一个回溯问题,实际上就是一个决策树的遍历过程.你只需要思考 3 个问题 ...

  6. 回溯算法团灭子集、排列、组合问题

    回溯算法团灭子集.排列.组合问题 一.子集 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] ...

  7. 回溯算法详解之全排列、N皇后问题

    回溯算法详解 回溯算法框架.解决一个回溯问题,实际上就是一个决策树的遍历过程.你只需要思考 3 个问题: 1.路径:也就是已经做出的选择. 2.选择列表:也就是你当前可以做的选择. 3.结束条件:也就 ...

  8. LeetCode Hot100 ---- 回溯算法专题

    回溯算法是什么?解决回溯算法相关的问题有什么技巧?如何学习回溯算法?回溯算法代码是否有规律可循? 其实回溯算法其实就是我们常说的 DFS 算法,本质上就是一种暴力穷举算法. 解决一个回溯问题,实际上就 ...

  9. 搞懂回溯算法,我终于能做数独了

    点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者:labuladong   公众号:labuladong 若已授权白名单也必须保留以上来源信息 经常拿回溯算法来说事儿的,无非就是八皇后问题和数独问题 ...

最新文章

  1. oracle limsize,Oracle9i AIX上单进程占用内存过多问题
  2. 这是啥?也太秀了吧?
  3. 我一哥们,在东莞和五名女孩被抓了.....
  4. 消费者rebalance机制分析
  5. OpenShift Security (12) - 用 RHACS 管理容器之间的网络访问策略
  6. linux pandas教程_这7种Python的全新玩法,你们一定不知道!(附赠Python教程)
  7. Python爬取王者荣耀皮肤
  8. mongodb和mysql空间占用_MongoDB的存储结构及对空间使用率的影响
  9. Makefile的学习笔记
  10. Mysql 中文中繁杂的字 插入报错的 解决方案
  11. Hcse 交换知识点-1
  12. 工具 - UI原型设计工具Pencil Project
  13. 最受欢迎的30款开源软件
  14. React tsx 生成随机验证码
  15. flex布局控制每行显示几个且有间隔
  16. 微信接入机器人实现对别人消息和群at消息的自动回复
  17. Task02 几何变换
  18. python图像检索
  19. matlab 导入/制作/导出 STK .tle卫星文件/数据(直接/间接,好几种方法)
  20. 从零实现深度学习框架——Seq2Seq从理论到实战【实战】

热门文章

  1. 喂,你经历过两三年前的前端开发吗?
  2. HTML5 API详解(14):Notification 实现桌面提醒
  3. 关于编程学习的一些思考 | 欢迎投稿
  4. Canvas X Draw for Mac7.0.2英文版
  5. python判断_python的判断
  6. P2249 【深基13.例1】查找(AC) 2022.1.28
  7. 批量无损删除项目中的代码注释方法
  8. PhpStorm failed to transfer files by FTP 报错解决方法
  9. php把时间戳转换成多少时间之前函数
  10. qt android文件读写文件,qt android 开发之写入xml配置文件篇