算法:回溯算法套路总结

news2024/12/26 23:28:49

目录

1、回溯算法最初的模板

2、收获节点包括剪枝、去重等操作需要在模板上加上什么东西

2.1 收获的是否为叶子节点

2.1.1 收获的是叶子节点的数据

2.1.2 收获的节点不是叶子节点的数据

2.2 能否重复选取数据

2.2.1 不能重复选取数据

2.2.2 可以重复选取数据

2.3 剪枝优化

2.4 去重

2.4.1 used 数组去重

2.4.2 set 集合去重

2.4.3 set 和 used 两者区别,该用哪个

2.5 回溯函数的返回值


        这几天刷了一下代码随想录回溯算法这一章节的题目,来总结一下一些小技巧,希望在以后能够直接看这篇文章就能想起回溯的套路

1、回溯算法最初的模板

void backtracking(参数) {
    //收获结果   
    if (终止条件) {
        存放结果;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

2、收获节点包括剪枝、去重等操作需要在模板上加上什么东西

2.1 收获的是否为叶子节点

2.1.1 收获的是叶子节点的数据

        如果得到的结果收获的是叶子节点的数据,在收获结果的时候,需要加上 return; 语句。

        举个例子,什么叫收获叶子节点的数据,例如力扣第77题:组合

 

从图中我们可以看到,最终的结果都是从叶子节点中拿到的

2.1.2 收获的节点不是叶子节点的数据

        反之,当不是从叶子节点中拿到数据的时候就不需要加上 return; 谈起这个原因是因为如果我不是从叶子节点取得结果,我就需要再往下去递归我这棵树,所以不能直接返回,例如:力扣第78题:子集

2.2 能否重复选取数据

        简单来说就是,有些一个是组合问题,对于组合来说[1,2] 和 [2,1] 是一样的,是需要去重的,但是对于排列问题来说,[1,2] 和 [2,1]是不一样的。当然不仅是组合,分割,子集也都是和组合问题一样,一直往后取的,不能重复的取之前的数据,所以需要用startIndex 来标注从哪里开始下一轮递归。

2.2.1 不能重复选取数据

        首先讲一下什么叫不能重复选取数据,在上面2.1.1 和 2.1.2中,我们可以看到,

        在取了2之后,就只能再3、4中去取数据了,而不是在1、3、4中获取数据,如果可以的话,就会出现 [1,2] 和 [2,1] 这两种相同的情况了。

        所以,在进行遍历的过程中,在for循环的开始的时候,初始值就应该从 startIndex 开始,每次递归进去的时候都是让 startIndex + 1,这样就可以保证每次进去都不会选到上面那个。

2.2.2 可以重复选取数据

先看一下上面叫可以重复选取数据,例如力扣第46题:全排列

 此处我们可以看到,用一个used数组来表示哪个元素已经用过了

2.3 剪枝优化

        在有些问题中,需要的结果是固定的,例如力扣第77题:组合,题目要求结果中有 k 个数据,所以如果在剩下来需要递归的集合中,已经不满足有那么多个数据了的话,就可以直接不进行继续递归了。

        在已经选择的 path 中,已经选择的元素的个数是 path.size();

        所以剩下来所需要的元素个数是 k - path.size();

        列表中剩余的元素的个数是 n - i 个,n 代表总的个数,i 代表已经循环到了哪一个,所以,如果列表中剩下来的个数少于需要的元素的个数,那么就显然不成立,如果要成立,即

        k - path.size() <= n - i    ----------->   i <= n - k + path.size()

2.4 去重

2.4.1 used 数组去重

        首先 used 数组听名字就知道是代表,已经使用过的元素,这里还需要在介绍一个 Carl 提出的概念,就是树枝去重树层去重。以力扣第40题:组合总和II为例,

        从图中最左边的 used[1,1,0] 中我们可以看到,当一个路径中(树枝),选取了两个相同的元素,用代码表示就是

i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true

        从图中中间的 [1,0,0] 和 [0,1,0] 中我们可以看到,[1,0,0]选取的是第一个1,[0,1,0]选取的是第二个1,如果第二个还要选的话就会出现两个 [1,2],这样显然是不行的,所以我们需要将第二中,即图中画X的那条路给去掉,用代码表示就是

i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false

2.4.2 set 集合去重

        used数组去重是有一定限制的,即数组要是排序过的,因为used数组判断的是当前的值和上一个的值是否是一样的,然后才能去重,但是并不是所有的数组都可以先进行排序的,例如力扣第491题:递增子序列,由于需要求一个数组中递增的子序列,如果先进行了排序的话明显就会出问题。

unordered_set<int> uset;
!path.empty() && nums[i] < path.back() || uset.find(nums[i]) != uset.end()

2.4.3 set 和 used 两者区别,该用哪个

        使用set去重的版本相对于used数组的版本效率都要低很多

        原因在回溯算法:递增子序列 (opens new window)中也分析过,主要是因为程序运行的时候对unordered_set 频繁的insert,unordered_set需要做哈希映射(也就是把key通过hash function映射为唯一的哈希值)相对费时间,而且insert的时候其底层的符号表也要做相应的扩充,也是费时的。

2.5 回溯函数的返回值

        当最终的结果只需要一个的时候,回溯函数的返回值为 bool 类型,因为我只需要找到一个成功的路径就需要立刻返回,相当于找从根节点到叶子节点一条唯一路径,例如力扣第37题:解数独

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

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

相关文章

Yolov8涨点技巧:BIFPN,加权双向特征金字塔网络,对小目标涨点显著

论文:https://arxiv.org/abs/1911.09070 🏆🏆🏆🏆🏆🏆Yolov8魔术师🏆🏆🏆🏆🏆🏆 ✨✨✨魔改网络、复现前沿论文,组合优化创新

[pgrx开发postgresql数据库扩展]7.返回序列的函数编写(3)多行表序列

前文再续&#xff0c;书接上一回。 上一回我们解析了如何通过pgrx编写srf&#xff0c;返回一个TableIterator&#xff0c;但是在具体应用的时候&#xff0c;我们还是针对一条记录返回了一行数据&#xff08;多个字段的一行&#xff0c;也还是一行&#xff09;&#xff0c;并没…

麒麟V10系统arm版安装g++时,发现的问题及解决方法

在麒麟V10系统&#xff0c;安装Qt时&#xff0c;发现没有g&#xff0c;打算安装一个 1. 用命令直接安装(需要连网) sudo apt-get install g 运行后出现报错&#xff1a;暂不能解析域名 若出现其他问题&#xff1a;https://www.5axxw.com/questions/simple/g7yvfq 2. 为解决报…

朝天椒USB Server登场!EastFax USB Server品牌重塑正式启动

EastFax USB Server是复园科技旗下的第三款toB技术服务产品&#xff0c;诞生于2019年&#xff0c;旨在帮助企业实现加密狗、Ukey、网银U盾等USB的远程调用&#xff0c;拔除卡在数字化转型齿轮里的“USB无法上云”的小石子。 EastFax USB Server的名称直接来自复园科技在十八年…

AIGC 综述 2023:A History of Generative AI from GAN to ChatGPT

GAI&#xff1a;发展历史&#xff0c;核心技术&#xff0c;应用领域以及未来发展 摘要1、引言1.1、主要贡献1.2、组织结构 2、生成式AI的发展历史2.1、NLP领域的发展2.2、CV领域的发展2.3、CV与NLP的融合 3、AIGC的核心技术基础3.1、经典基础模型3.1.1、Transformer3.1.2、Pre-…

面试十分钟不到就被赶出来了,问的实在是太变态了...

从外包出来&#xff0c;没想到算法死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内…

8年开发经验,浅谈 API 管理

随着信息化飞速增长的还有各信息系统中的应用接口&#xff08;API&#xff09;&#xff0c;API作为信息系统内部及不同信息系统之间进行数据传输的渠道&#xff0c;其数量随着软件系统的不断庞大而呈指数型增长&#xff0c;如何管理这些API已经在业界变得越来越重要&#xff0c…

网络管理 - OSPF 动态路由协议

文章目录 1 概述1.1 五种报文1.2 运行原理1.3 区域概念1.4 状态1.5 身份 2 实验配置2.1 网络拓扑图2.2 配置命令 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-EOOBZo0uztmJLHOT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#m…

强化学习:贝尔曼最优公式

策略改进案例 强化学习的目的是寻找最优策略。其中涉及两个核心概念最优状态值和最优策略&#xff0c;和一个工具&#xff1a;贝尔曼最优公式。   首先&#xff0c;我们给出一个熟悉的例子&#xff0c;了解贝尔曼方程是如何改进策略的。 根据给出的策略&#xff0c;我们很容…

jsonpath 语法介绍

文章目录 前言 一、对jsonpath的理解 二、补充 三、哪里可以用的到呢&#xff1f; 总结 前言 在使用Python做接口测试中需要获取json中的字段值&#xff0c;因此需要使用jsonpath里面的提取规则&#xff0c;所以特意学习了jsonpath中的语法。 一、对jsonpath的理解 在线运…

ZigBee案例笔记 - 定时器

文章目录 1.片内外设I/O2.定时器简介3.定时器1寄存器4.定时器1操作自由运行模式模模式正计数/倒计数模式 5.16位计数器定时器1控制LED 示例 6.定时器3概述自由运行模式倒计数模式模模式正/倒计数模式 7.定时器3寄存器定时器3控制LED闪烁 1.片内外设I/O 定时器这样的片内外设也…

微信小程序原生开发功能合集十五:个人主页功能实现

本章个人主页功能实现,展示当前登录用户信息、个人主页、修改密码、浏览记录、我的收藏、常见问题、意见反馈、关于我们等界面及对应功能实现。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如…

django ORM框架 第四章 聚合函数

上一章&#xff1a;django ORM框架 第三章 关联表的数据创建与查询_做测试的喵酱的博客-CSDN博客 一、聚合函数类型&#xff1a; from django.db.models import Q, Count, Avg, Max, Min 班级表&#xff1a; 学生信息表&#xff1a; 1.1 Count 模版&#xff1a; QuerySet.…

如何将m4a音频转换mp3格式,5种简单方法帮你处理

如何将m4a音频转换mp3格式&#xff1f;这个问题想必在工作生活中经常遇到吧。为什么要将m4a音频转换mp3格式呢&#xff1f;首先&#xff0c;M4A是一种较新的高质量音频文件格式&#xff0c;通常用于存储高保真度的音频文件&#xff0c;例如音乐录音室的原始录制。但是&#xff…

基于C#制作一个ChatGPT桌面助手

基于C#制作一个ChatGPT桌面助手&#xff0c;在工作或者学习时提升自己的效率&#xff0c;工欲善其事&#xff0c;必先利其器。 一、前言1.1、什么是ChatGPT1.2、ChatGPT官网及key申请 二、后台项目2.1、项目创建2.2、界面设置2.3、获取版本2.4、发送信息 一、前言 1.1、什么是…

深度学习实战31-开发基于机器学习的在线图像识别工具

大家好,我是微学AI,今天给大家讲一下深度学习实战31-开发基于机器学习的在线图像识别工具,本文开发一个基于机器学习的在线图像识别工具,用户可以上传一张图片,并得到对应的标签或分类信息。该工具应该支持多种图像类型,例如自然风景、动物、物品等,并且在处理复杂图像时…

面向移动机器人的道路环境感知

分享嘉宾 | 范睿 文稿整理 | William 自动驾驶感知 首先&#xff0c;三维几何模型背后的机理是多视图几何学&#xff0c;多视图几何学是指想要得到对应模型的三维几何架构&#xff0c;则必须要用相机在两个不同的位置进行拍照。如图1&#xff0c;可以通过利用两个相机在不同位…

【HarmonyOS】【JS】小白的鸿蒙学习之路2--小小的图片啊,动呀动起来

【关键字】 image组件、动画 【介绍】 今天和大家分享下&#xff0c;我在官网上学习的一篇Codelab。这篇帖子通过一个代码示例&#xff0c;实现image组件的平移、缩放、旋转和透明度变化效果。话不多说&#xff0c;我们一起学起来吧&#xff01; 【成果展示】 【开发步骤】 …

FE_VUE路由 细致解读router/index.js的配置

1 安装vue-router插件 安装vue-router&#xff0c;命令&#xff1a;npm i vue-router 【npm i vue-router3】&#xff0c;在main.js 中引入路由文件&#xff1a; import router from ./router&#xff0c; 注意router 不要变且为小写&#xff1b;注册路由&#xff08;因为main…

商场室内地图导航如何实现?商场室内导航地图怎么做?

商场室内地图导航如何实现&#xff1f;现在&#xff0c;消费者的消费观念和消费心理日趋成熟&#xff0c;对于购物商场的要求也愈加挑剔。电子地图作为大家最喜闻乐见的高效应用形式&#xff0c;能够在顾客购物的过程中带来非常大的帮助和体验&#xff0c;对于在大型的综合商场…