Hello算法笔记之回溯

news/2024/11/6 6:58:22/

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

通常采用「深度优先搜索」来遍历解空间(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.ppmy.cn/news/698671.html

相关文章

卷积神经网络--猫狗系列之构建模型【ResNet50】

在上一期:卷积神经网络--猫狗系列之下载、导入数据集,如果测试成功就说明对数据的预处理工作已经完成,接下来就是构建模型阶段了: 据说建立一个神经网络模型比较简单,只要了解了各层的含义、不同层之间参数的传递等等&…

浩泽净水机——以核心科技赢得信赖

近年来,家用净水机市场在国内取得快速的发展,越来越多的家用净水机已经逐步走入寻常百姓家。但是,由于净水行业在国内起步比较晚,消费者对家用净水机的认识还是有所欠缺,所以消费者在选购时需多方面考虑。 首先&#x…

High Performance Visual Tracking with Siamese Region Proposal Network(SiamRPN)

High Performance Visual Tracking with Siamese Region Proposal Network(SiamRPN,CVPR2018) 主要贡献: 提出了SiamRPN跟踪器,首次将端到端的离线训练方式,应用到了大尺度的图像跟踪任务上在在线跟踪过程…

乱象丛生or一路光明,看SSD市场发展现状

乱象丛生or一路光明,看SSD市场发展现状 近年来,SSD固态硬盘的涌现无疑是主存储技术上的重大突破,它对传统的机械存储是具有颠覆性及破坏性,尤其体现在家用消费领域里。SSD任凭着革命性的多任务处理能力,卓越的读写性能…

C++中的vector使用详解及重要部分底层实现

本篇文章会对vector的语法使用进行详解。同时,还会对重要难点部分的底层实现进行讲解。其中有vector的迭代器失效和深拷贝问题。希望本篇文章的内容会对你有所帮助。 目录 一、vector 简单概述 1、1 C语言中数组的不便 1、2 C中的动态数组容器vector 二、vector的常…

Qt Example各例子技术点说明(六)

说明: 下面的XX.XX.XX为Qt的版本号,如:5.14.1。 下面总结的都是以Qt的5.14.1版本来说明的,未来的版本也许和这有些不同。 因为Qt自带的例子很多,本博文是第6部分,第1、2、3、4、5部分请参见如下链接&…

直击|OPPO宣布推出新系列Reno 产品将于4月发布

新浪科技讯 3月11日上午消息,OPPO副总裁、中国大陆事业部总裁沈义人今日在微博宣布,OPPO正式推出新系列Reno。 此前,沈义人曾在微博上回复新浪手机称,今年没有R19的发布,这引发了外界对OPPO旗下产品系列今年将发生调整…

HOT33-排序链表

leetcode原题链接:排序链表 题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出…