DFS算法系列 回溯

DFS算法系列-回溯

文章目录

  • DFS算法系列-回溯
    • 1. 算法介绍
    • 2. 算法应用
      • 2.1 全排列
      • 2.2 组合
      • 2.3 子集
    • 3. 总结

1. 算法介绍

回溯算法是一种经典的递归算法,通常被用来解决排列问题、组合问题和搜索问题

基本思想

从一个初始状态开始,按一定的规则向前搜索,当搜索遇到瓶颈无法再前进时,回到当前状态的上一个状态,按照新的要求/条件继续向前搜索,直至所有可用条件都遍历完成。

简单的说就是:不撞南墙不回头

对于回溯算法,其核心就在于不断的"试错",若选择正确则继续往下搜索,否则就"回头"选择另一个选项继续往下搜索。

下面提供一个回溯算法的模板(模板只是对算法理解的总结概况,相较于没有思考的套模板,理解其中的算法思想更加重要–>通过做题积累)

List<List<Integer>> ret;
List<Integer> path; void dfs(int[] nums, ...) {// 满⾜结束条件if (/* 满⾜结束条件 */) {// 将路径添加到结果集中ret.add(new ArrayList<>(path));return;}// 遍历所有选择for (int i = 0;i < nums.size();i++) {// 做出选择path.add(nums[i]);  // 做出当前选择后继续搜索dfs(path, nums);// 恢复现场path.remove(path.size() - 1);}
}

其中path用来记录每次选择后改变的路径nums[i]表示当前做出的选择,并且在当前选择满足递归结束条件后,将当前路径添加到结果集中,结束当前层递归并恢复现场,即恢复刚刚完成修改的路径到上一个状态,才能继续处理当前层的另一个选择,如下图所示:

在这里插入图片描述

了解完回溯算法,我们来做一些相关的算法题加深印象!

2. 算法应用

对于回溯(以及DFS相关的题),建议的解题步骤:

  1. 先画决策树
  2. 根据决策树编写函数体,可设置全局变量、添加剪枝提高效率;
  3. 找到递归出口

2.1 全排列

题目链接:[全排列]

决策树

在这里插入图片描述

代码示例

class Solution {List<List<Integer>> ret;List<Integer> path;boolean[] check;public List<List<Integer>> permute(int[] nums) {ret = new ArrayList<>();path = new ArrayList<>();check = new boolean[nums.length];dfs(nums);return ret;}void dfs(int[] nums) {if (path.size() == nums.length) {ret.add(new ArrayList(path));return;}for (int i = 0;i < nums.length;i++) { // 这里让i=0,使下一层选项依旧为所有情况(1,2,3,4)if (!check[i]) { // check数组用来记录当前数字是否被使用check[i] = true;   path.add(nums[i]); // 将数字添加到路径中dfs(nums);check[i] = false;path.remove(path.size() - 1);}}}
}

2.2 组合

题目链接:[组合]

决策树:

在这里插入图片描述

代码示例

class Solution {List<List<Integer>> ret;List<Integer> path;boolean[] check;int len;int pre;public List<List<Integer>> combine(int n, int k) {ret = new ArrayList<>();path = new ArrayList<>();check = new boolean[n + 1];len = k;int[] nums = new int[n + 1];for (int i = 1;i <= n;i++) {nums[i] = i;}dfs(nums, 1);return ret;}public void dfs(int[] nums, int pos) {if (path.size() == len) { // 当路径长度和要求的组合数相等时返回ret.add(new ArrayList<>(path));return;}for (int i = pos;i <= nums.length - 1;i++) { // 这里让i=pos,使下一层选项不会出现当前数字,并且下层选项从pos+1开始if (!check[i]) {	path.add(nums[i]);  check[i] = true;dfs(nums, i + 1);path.remove(path.size() - 1);check[i] = false;}}}
}

注:这里让i=pos,使下一层选项不会出现当前数字,并且下层选项从pos+1开始若为i = 0,则使下一层选项依旧为所有情况(1,2,3)

在这里插入图片描述

2.3 子集

题目链接:[子集]

决策树

在这里插入图片描述

代码示例

class Solution {static List<List<Integer>> ret;static List<Integer> path;public List<List<Integer>> subsets(int[] nums) {ret = new ArrayList<>();path = new ArrayList<>();dfs(nums, 0);return ret;}public void dfs(int[] nums, int cur) {ret.add(new ArrayList<>(path)); // 此处不设出口目的是将每个节点路径都添加到ret中for (int i = cur;i < nums.length;i++) { // 这里让i=cur,使下一层选项不会出现当前数字,并且下层选项从cur+1开始path.add(nums[i]);dfs(nums, i + 1);path.remove(path.size() - 1); }}
}

3. 总结

总的来说,回溯就是不断的"试错"并回头进行新的选择,和回溯相关的题就要把决策树画出来,通过它来找到我们的递归出口并编写函数体(注意for循环中起始标的使用),注意记得恢复现场哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传世手游之冰雪传世_经典角色扮演PK类三职业传奇手游

传世手游之冰雪传世_经典角色扮演PK类三职业传奇手游_Linux服务端_通用视频架设教程_GM网页授权物品后台_苹果IOS安卓双端 源码仅供学习研究之用&#xff0c;请勿商用或者其他违法用途&#xff0c;产生其他后果与本站无关 下载地址&#xff1a;极速云

动态代理导致的Metaspace OOM(元空间内存溢出)问题

个人博客地址&#xff1a;https://blog.flycat.tech/archives/1710866783664 背景 我们团队的一个项目&#xff0c;测试环境最近隔三岔五报错&#xff0c;虽然不是生产环境&#xff0c;但既然有报错那还是得排查下&#xff0c;以免带到了生产环境导致事故。 登录上测试环境服…

navicat远程连接mysql的异常解决-1130-2003-10061

结论&#xff1a; 1、修改数据库下root用户的host字段(为空或%) 2、修改 /etc/mysql/mysql.conf.d/mysqld.cnf 文件下 bind-address 的配置为 0.0.0.0 或者屏蔽此配置内容 (默认配置是&#xff1a; bind-address 127.0.0.1) 补充&#xff1a; 查看数据库下用户与host字段的关…

代码签名证书需要多少钱?

使用网络安全领域最知名的品牌来保护您的内容。 代码签名证书是有助于保护用户免遭下载文件或不受信任的应用程序的数字证书。 目前价格可以在Gworg控制面板里面查看价格&#xff0c;这样看到的价格可以包括所有的机构不同的价格。 概括 组织验证证书。1-3 年有效期选项。每个代…

实验一:配置IP地址

实验环境 主机A和主机B通过一根网线相连 需求描述 为两台主机配置IP地址&#xff0c;验证IP地址是否生效&#xff0c;验证同一网段的两台主机可以互通&#xff0c;不同网段的主机不能直接互通 一.实验拓扑 二.推荐步骤 1.为两台主机配置P地址&#xff0c;主机A为192.168.1.…

一款功能齐全的iOS混淆工具介绍及功能详解

机缘巧合偶遇iOS马甲包业务&#xff0c;前期也使用过目前市面上其他得工具&#xff0c;实际效果不太理想。经过大量实践&#xff0c;开发出一款功能齐全的混淆工具。工具的主要功能OC、C、Swift已封装成Mac应用&#xff0c;其他功能还在封装中&#xff0c;敬请期待。 马甲包的本…

Go gin框架(详细版)

目录 0. 为什么会有Go 1. 环境搭建 2. 单-请求&&返回-样例 3. RESTful API 3.1 首先什么是RESTful API 3.2 Gin框架支持RESTful API的开发 4. 返回前端代码 go.main index.html 5. 添加静态文件 main.go 改动的地方 index.html 改动的地方 style.css 改动…

19.java openCV4.x 入门-Imgproc之图形绘制

专栏简介 &#x1f492;个人主页 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天建议把本文当作笔记来看&#xff0c;据说专栏目录里面有相应视频&#x1f92b; &#x1f4f0;专栏目录 Imgproc之图像绘制 一、直线绘制字段1…

基于Springboot的酒店管理系统

基于SpringbootVue的酒店管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 网站首页 客房服务 客房信息 酒店公告 个人中心 后台登录 用户管理 客房类型管理…

微软搭建零售新媒体创意工作室大举抢占数字营销广告市场

“微软新零售创意工作室新平台利用生成式人工智能&#xff0c;在几秒钟内轻松定制横幅广告。零售媒体预计到2026年将成为一个价值1000亿美元的行业。” 零售媒体在过去几年中发展迅速。根据eMarketerOpens在新窗口的数据&#xff0c;预计到2024年&#xff0c;仅美国的零售媒体…

Python --- 怎么把Python当计算器用?(小白自学笔记)

怎么把Python当计算器用&#xff1f;(小白自学笔记) Part I&#xff1a;标准数学包的导入 今天刚刚装了python&#xff0c;打算用它来取代matlab的基本计算功能&#xff0c;当我的日常计算器用。(这里还有一个捷径&#xff0c;如果你跟我一样也是纯小白的话&#xff0c;直接问c…

并发 MiniHttp 服务器

项目需求 实现一个http 服务器项目&#xff0c;服务器启动后监听80端口的tcp 连接&#xff0c;当用户通过任意一款浏览器访问我们的http服务器&#xff0c;http服务器会查找用户访问的html页面是否存在&#xff0c;如果存在则通过http 协议响应客户端的请求&#xff0c;把页面…

SQLite数据库文件格式(十五)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite 4.9的虚拟表机制(十四) 下一篇&#xff1a;SQLite超详细的编译时选项&#xff08;十六&#xff09; ► 目录 本文档描述和定义磁盘上的数据库文件 自 SQLite 以来所有版本使用的格式 版本 3.0.0 &#xff08;2004-06-18…

HCIP的学习(8)

OSPF数据报文 OSPF头部信息&#xff08;公共固定&#xff09; 版本&#xff1a;OSPF版本&#xff0c;在IPv4网络中版本字段恒定为数值2&#xff08;v1属于实验室版本&#xff0c;v3属于IPv6&#xff09;类型&#xff1a;代表具体是哪一种报文&#xff0c;按照1~5排序&#xff…

AIGC 探究:人工智能生成内容的技术原理、广泛应用、创新应用、版权问题与未来挑战

AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;即人工智能生成内容&#xff0c;其核心在于利用深度学习技术&#xff0c;尤其是基于神经网络的模型&#xff0c;来模拟人类创作过程&#xff0c;自主生成高质量的文本、图像、音频、视频等各类内容。神经…

GDPU Java 天码行空7

实验目的&#xff1a; 熟悉awt组件和三种基本布局&#xff0c;掌握按钮、文本框、标签、等基本控件的使用和事件响应编程。 熟悉布局管理器 1. 窗体关闭事件 &#x1f496; WindowCloseEvent.java import java.awt.event.WindowAdapter; // 导入WindowAdapter类&#xff0c;…

江新安教授受邀金佰利进行《研发创新与创新思维》培训

近日&#xff0c;科济管线创始人江新安教授受邀金佰利为金佰利全国研发团队进行《研发创新与创新思维》培训授课。创新思维的两种思维形式——非逻辑思维和逻辑思维及其训练的主要方法。创新思维的培养&#xff0c;对于克服思维定势&#xff0c;提供创新方法&#xff0c;可以发…

FreGS:具有渐进频率正则化的3D高斯溅射

FreGS: 3D Gaussian Splatting with Progressive Frequency Regularization FreGS&#xff1a;具有渐进频率正则化的3D高斯溅射 Jiahui Zhang1  Fangneng Zhan2  Muyu Xu1  Shijian Lu1  Eric Xing3, 4 张家慧 1 詹方能 2 许慕玉 1 卢世坚 1 邢志伟 3, 4 1Nanyang Technolo…

19岁第一份“贺礼”,美创蝉联“2023年度数字化赋能服务商”

在即将到来的19岁&#xff0c;美创科技迎来第一份生日“贺礼”&#xff0c;再次蝉联“2023年度数字化赋能服务商”&#xff01; 4月13日&#xff0c;以“数聚浙里 智领未来”为主题&#xff0c;由浙江省首席信息官协会主办的数字化转型与升级论坛暨CIO年度峰会于杭州隆重召开。…