当前位置: 首页 > news >正文

回溯算法的思路总结

基本步骤

这种回溯类型的题目老是莫名其妙的可以做出来,但是不清楚具体的逻辑

下次做回溯类型的题目可以画出这个决策树

回溯 = 在这棵树上 DFS 深度优先遍历,走所有可能的路径

                    (sum=0, path=[])/             \+2 /                 \ +3/                   \(sum=2, [2])           (sum=3, [3])/         \               |+2 /           \ +3         +2/             \           |
(sum=4, [2,2])    (sum=5, [2,3]) (sum=5, [3,2])|+2? → sum=6 >5 → 剪枝

面对回溯题,我应该如何思考

  1. 想清楚每一步要做什么选择,这决定了 for 循环的内容

    • 全排列:当前要填第 i 个位置,我能选“还没用过的数”
    • 组合总和:当前要选一个数加入 path,我能选“从 start 开始的数”(避免重复组合)
  2. 设计递归的函数,我需要记住哪些信息才能继续走?dfs(…) 的参数。

    • path:当前走了哪些路(当前组合)
    • sum / target:当前状态(如和、深度等)
    • start:从哪开始选(避免重复)
    • used[]:哪些元素已用(排列问题)
  3. 写“终止条件” —— 什么时候停下来?

    1. 成功,sum == targetans.add(new ArrayList<>(path))
    2. 失败,sum > target → 直接返回(剪枝)
  4. 写“循环 + 选择 + 递归 + 撤销”

    1.  for (每个可选的选项) {if (剪枝) continue;// 1. 做选择(记录状态)path.add(x);// 2. 递归:走进下一层dfs(新状态);// 3. 撤销选择(恢复现场)path.remove(path.size() - 1);}
      

如何看懂嵌套的函数调用

大多数人的误区是:

我要跟着 dfs 一层层进去,看它怎么执行……”

结果越跟越晕

正确做法是:

假设 dfs 能搞定“从当前状态出发的所有解” ,你只关心“我做了一个选择后,剩下的交给 dfs 去处理”

你只相信 dfs 会把“以当前 path 为前缀的所有解”都找出来,只要处理好当前的选择问题,剩下的就不要考虑了。

同时最好画一下决策树,这样能够更有利于判断。

http://www.dtcms.com/a/416201.html

相关文章:

  • 江汉建站公司可以拿自己电脑做网站
  • 合肥做网站维护的公司专业定制网站公司
  • Docker简单学习
  • [学习日记][ssm p103以前]
  • 做网站1000以下哪家好海淀做网站设计的公司
  • 有的网站打不开 但别人电脑能打开跨境电商热销产品排行
  • 网站统计代码丹东网站推广
  • 从“链”到“图”:LangGraph如何终结LangChain的线性智能体
  • 专业的个人网站建设哪家登封网络推广
  • 东莞全网合一网站iis网站重定向设置
  • 基于STM32与influxDB的电力监控系统-4
  • c++字符串类型
  • 优化算法之梯度下降
  • js继承—15
  • 做网站哪家服务器好免费发广告的网站
  • 企业网站优化软件南通网站建设价格
  • 做营销型网站一般要多少钱ios移动网站开发详解 pdf
  • 使用Scade One建模N阶FIR滤波器
  • wordpress回收站在哪里免费的网络推广渠道
  • 基于深度学习模型融合的工业零部件工艺缺陷检测算法有哪些?
  • I2C设备通信失败,逻辑分析仪采集不到信号,或者从机无应答
  • 投资20万做网站好吗网络营销收获与体会
  • 虹口专业网站建设网站备案在外地
  • 栈和队列的算法题
  • 记录一次面经八股学习
  • 盐山县网站建设价格涪城移动网站建设
  • 成都专业做网站的公司做网站类型
  • .net做的网站代码如何做门户网站
  • AI 系统常见攻击类型及核心原理解析
  • 怀化网站优化哪里有wordpress百度xml