Hello算法笔记之回溯

news2024/10/5 4:40:36

一、回溯算法介绍:一种通过穷举来解决问题的方法,它的核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,当遇到正确的解则将其记录,直到找到解或者尝试了所有可能的选择都无法找到解为止。

通常采用「深度优先搜索」来遍历解空间(DFS)。在二叉树章节中提到的前序、中序和后序遍历都属于深度优先搜索。

例题一:给定一个二叉树,搜索并记录所有值为 7 的节点,返回节点列表。

 例题二:在二叉树中搜索所有值为 7 的节点,返回根节点到这些节点的路径

 当走过左下角的节点之后,就会从路径中删掉左下角这个点,并且回到左下角的父节点,进行root.right的遍历,以此类推

复杂的回溯问题还可以加一些约束条件,如例题三:在二叉树中搜索所有值为 7 的节点,返回根节点到这些节点的路径,路径中不能包含值为 3 的节点

当遇到node.val为3时,提前终止搜索 

回溯算法框架代码:

record_solution是更新res

make_choice是更新state

 用此框架解问题三:

 

二、回溯算法的应用

1.全排列问题:在给定一个集合(如一个数组或字符串)的情况下,找出这个集合中元素的所有可能的排列。

①给定的数组中无重复元素的情况:

从回溯算法代码的角度看,候选集合 choices 是输入数组中的所有元素,状态 state 是直至目前已被选择的元素。注意,每个元素只允许被选择一次,因此在遍历选择时,应当排除已经选择过的元素

 ②给定的数组中可能包含重复元素,返回所有不重复的排列

 注意duplicated没有传到backtrack中哦。每轮 backtrack 都包含一个 duplicated 。

 

 假设元素两两之间互不相同,则 n 个元素共有 n! 种排列(阶乘);在记录结果时,需要复制长度为 n 的列表,使用 O(n) 时间。因此,时间复杂度为 O(n!n) 。

空间复杂度:①是O(n) ②是O(n^2)(因为同一时间可能有n个backtrack中的不同duplicated)

2.子集和问题

①给定一个正整数数组 nums 和一个目标正整数 target ,请找出所有可能的组合,使得组合中的元素和等于 target 。给定数组无重复元素,每个元素可以被选取多次。请以列表形式返回这些组合,列表中不应包含重复组合。

 但这里面可能会有重复的子集,比如{4,5}和{5,4}在这里就被算作了两种子集,所以需要剪枝

 ②给定数组可能包含重复元素,每个元素只可被选择一次。列表中不应包含重复组合和重复元素。

 不允许重复选择元素,所以这里backtrack(state, target - choices[i], choices, i + 1, res)中传回去的不是i而是i+1

 

3.N皇后问题:根据国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。给定 n 个皇后和一个 N×N 大小的棋盘,寻找使得所有皇后之间无法相互攻击的摆放方案。比如:

 本题共有三个约束条件:多个皇后不能在同一行、同一列和同一对角线(对角线有两条哦)

1.逐行放置(剪枝1)

2. 用一个长度为 n的布尔型数组 cols 记录每一列是否有皇后。在每次决定放置前,我们通过 cols 将已有皇后的列剪枝,并在回溯中动态更新 cols 的状态。(剪枝2)

3.若两个格子满足 row1 - col1 == row2 - col2 ,则这两个格子一定处在一条主对角线上。 若row1 + col1 == row2 + col2,则这两个格子一定处在一条次对角线上。(剪枝3)

 

diag1 = row - col + n -1 是因为row - col 最小等于1-n 

时间复杂度O(n!)空间复杂度O(n^2)(state使用O(n^2)的空间)

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

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

相关文章

【论文阅读】【yolo系列】YOLACT Real-time Instance Segmentation

论文链接:https://arxiv.org/pdf/1904.02689.pdf Abstract 我们提出了一个简单的、全卷积的实时实例分割模型, 【速度和精度】该模型在TitanXp上训练MSCOCO数据集以33.5帧ps的速度达到29.8 mAP,比以往任何竞争方法都要快得多。此外&#xff0…

chatgpt赋能python:Python连接蓝牙模块:实现IoT设备的控制

Python连接蓝牙模块:实现IoT设备的控制 随着物联网技术的不断发展,连接设备的关键变得越来越重要。Python语言是一种灵活易用、快速上手的编程语言,已经成为众多物联网应用的首选编程语言之一。其中,Python连接蓝牙模块的应用越来…

【聚类算法】MeanShift算法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 MeanShift算法,同样是一种基于密度的聚类算法。两种算法直观理解都比较好理解。 DBSCAN:向身边人逐渐发展下线模式 MeanShfit&…

【Unity 实用插件篇】 | UI适配神器 Device Simulator 移动设备模拟器 的详细使用方法

前言 【Unity 实用插件篇】 UI适配神器 Device Simulator 移动设备模拟器 的详细使用方法一、安装Device Simulator包二、使用Device Simulator模拟各种设备三、自定义设备类型信息 总结 🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由…

windowsVNC远程桌面连接虚拟机

准本环境关闭防火墙 systemct stop firewalld setenforce 0 iptables -F 第一步虚拟机安装VNC yum -y install tigervnc-server 第二步VNC密码 vncserver 查看vnc进程和ID windows客户端 下载 VNC 服务器 |VNC 连接 (realvnc.com)

开始商业太空飞行将推动维珍银河股价上涨

来源:猛兽财经 作者:猛兽财经 总结 (1)维珍银河宣布将在6月底开始商业太空飞行,这将成为该公司的一个重要里程碑事件。 (2)太空旅游飞行市场预计将在未来十年呈指数级增长,维珍银河…

如何在Windows中启用或禁用脱机文件

脱机文件是同步中心的一项功能,即使与服务器的网络连接不可用,用户也可以使用网络文件。 用户可以使用脱机文件(如果启用)使其网络文件始终脱机可用,以便在计算机上保留存储在网络上的文件副本。这使得用户即使在未连接到网络或服务器不可用的情况下也可以与他们一起工作…

ModaHub魔搭社区:详解向量数据库Milvus的Mishards:集群分片中间件(四)

目录 Mishards 简单示例 启动示例 前提条件 启动 Milvus 和 Mishards 实例 使用 docker-compose 启动示例 Mishards 简单示例 启动示例 前提条件 安装 MilvusPython 版本 3.6 及以上 启动 Milvus 和 Mishards 实例 请按照以下步骤在单机上启动单个 Milvus 实例和 Mis…

实现数据的搜索( 筛选 )功能

搜索功能 : 可以根据搜索框对数据进行搜索, 筛选出满足条件的数据, 搜索功能主要还是后端的SQL语句的拼接, 查出满足需求的数据, 再展示给前端 前端 : 在前端我们可以在 ElementUI里获取对应的功能组件 这里与发送到后端的表单数据里的account进行绑定也就是此处我们要用accou…

【AUTOSAR】BMS开发实际项目讲解(十六)----电池管理系统系统电池单体过充保护

系统设计 /System Design 电池单体过充保护 关联的系统需求 TSR-BMS-1101、TSR-BMS-1102、TSR-BMS-1103、TSR-BMS-1104、TSR-BMS-1105、TSR-BMS-1106、TSR-BMS-1106、TSR-BMS-1107、TSR-BMS-1108、TSR-BMS-1109、TSR-BMS-1110、TSR-BMS-1111、TSR-BMS-1112、TSR-BMS-1113、TSR…

50个知识点由浅入深掌握Javascript

前言 近期整理了JavaScript知识体系,50个知识点由浅入深掌握Js建议收藏,如有问题,欢迎指正。 1. 说说你对JS的理解 1995年,布莱登艾奇(美国人)在网景公司,用10天写的一门语言。 Js是一门&…

【ArcGIS】使用ArcMap进行北京1954-120E坐标转WGS84坐标系

背景 在进行青岛地市GIS数据迁移,涉及坐标转换,经过几天摸索终于找到迁移方法 投影坐标系 北京1954-120E坐标 对应为高斯-克吕格投影 300000 3000001 0 0(青岛本地坐标) 增量:-300000 -3000001(此处为示例&#xff0c…

Python print()函数使用详解,Python打印输出

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 print() 可以「打印输出」,常用来将内…

ICV报告:2023年全球量子信息上市企业第一季度报告

ICV分析师在报告中所认定的“上市”,指的是公司公开发行股票(例如IPO)、公司在交易所挂牌交易、公司以SPAC(特殊目的收购公司)等形式进入公开交易市场,实现公司资本化并披露公司信息的情况。 报告研究的“…

预约时间列表

/*** 时间列表* $interval 间隔X分钟* */ function timeList($day7,$time108:00,$time222:00,$interval60){$date_list [];//日期列表$today_date strtotime(date(Y-m-d,time()));for($i0;$i<$day;$i){$date_title date(Y-m-d,$today_date($i*86400));$buff array();for…

MATLAB App Designer基础教程 Matlab GUI入门(二)

MATLAB GUI入门 第二天 —— Lamp (灯)霓虹灯控件的使用 一、主要内容: 技巧 1.Tooltip的使用 2.Vislble和Enable 3.lf函数语句的使用需求&#xff1a;根据阈值进行提示 1.红色温度过高>500 ⒉橙色温度适中400~500 3.蓝色温度过低<400 二、项目背景: &#xff08;案例…

简单的手机记事本哪个好用?

在快节奏的现代生活中&#xff0c;我们经常需要记录下来重要的信息&#xff0c;而手机记事本成为了不可或缺的工具。然而&#xff0c;市面上琳琅满目的手机记事本软件&#xff0c;让人眼花缭乱&#xff0c;不知道该选择哪一个。 敬业签是功能强大、操作简单的手机记事本&#…

最新,2023年6月CDGP设计及论述题解析

2023年6月CDGP设计及论述题解析 &#xff08;加gzh“大数据食铁兽”&#xff0c;回复“2023cdgp”获取完整版&#xff09; 酒店会员建模 结合国内外数据安全法律法规&#xff0c;谈谈境外传输数据安全管理体系建设 国内&#xff1a;《数据安全法》、《网络安全法》、2022年9月…

【juc】原子数组

目录 一、代码示例二、示例截图 一、代码示例 package com.learning.atomic;import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicIntegerArray; import java.util.function.BiConsumer; import java.uti…

Qt-解决异常报错“QAxBase::setControl: requested control XXX could not be instantiated”

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 问题说明 使用Qt开发的过程中&#xff0c;QAxObject是经常用到的一个类&#xff0c;用于操作Windows中各种COM接口&#xff0c;进…