![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
回溯法
文章平均质量分 62
回溯
想名字多费事
编程小白入驻
展开
-
拆分字符串使唯一子字符串的数目最大
思路:方法一:回溯拆分给定的字符串,要求拆分后的每个子字符串唯一,求子字符串的最大数目,可以通过回溯算法实现。对于长度为 n的字符串,有n−1个拆分点。从左到右遍历字符串,对于每个拆分点,如果在此拆分之后,新得到的一个非空子字符串(即拆分点左侧的最后一个被拆分出的非空子字符串)与之前拆分出的非空子字符串都不相同,则当前的拆分点可以进行拆分,然后继续对剩下的部分(即拆分点右侧的部分)进行拆分。判断拆分出的非空子字符串是否有重复时,可以使用哈希表。当整个字符串拆分完毕时,计算拆分得到的非空子字符串的.原创 2021-09-20 16:19:55 · 332 阅读 · 0 评论 -
回溯算法性能分析
性能分析「关于回溯算法的复杂度分析在网上的资料鱼龙混杂,一些所谓的经典面试书籍不讲回溯算法,算法书籍对这块也避而不谈,感觉就像是算法里模糊的边界」。「所以这块就说一说我个人理解,对内容持开放态度,集思广益,欢迎大家来讨论!」以下在计算空间复杂度的时候我都把系统栈(不是数据结构里的栈)所占空间算进去。子集问题分析:时间复杂度:O(n * 2n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2n),构造每一组子集都需要填进数组,又有需要O(n),最终时间复杂度:O(n * 2^n)空间复原创 2021-05-21 17:34:56 · 2058 阅读 · 0 评论 -
解数独-难哭了
呜呜呜,代码随想录,算法不迷路 强推!思路棋盘搜索问题可以使用回溯法暴力搜索,只不过这次我们要做的是「二维递归」。怎么做二维递归呢?N皇后问题是因为每一行每一列只放一个皇后,只需要一层for循环遍历行,递归来遍历列,然后一行一列确定皇后的唯一位置。本题就不一样了,「本题中棋盘的每一个位置都要放一个数字,并检查数字是否合法,解数独的树形结构要比N皇后更宽更深」。因为这个树形结构太大了,我抽取一部分,如图所示:回溯三部曲递归函数以及参数「递归函数的返回值需要是bool类型,为什么呢?」...原创 2021-05-21 17:01:16 · 69 阅读 · 0 评论 -
N皇后
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。思路n皇后问题也是回溯算法解决的经典问题。首先来看一下皇后们的约束条件:不能同行不能同列不能同斜线确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。从图中,可以看出,二维矩阵中矩阵的高就是这颗树的高度,矩阵的宽就是树型结构中每一个节点的宽度。那么我们用皇后们的约束条件,来回溯搜索这颗树,「只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了」。回溯三部曲1、..原创 2021-05-20 15:57:55 · 132 阅读 · 0 评论 -
重新安排行程
思路直觉上来看 这道题和回溯法没有什么关系,更像是图论中的深度优先搜索。实际上确实是深搜,但这是深搜中使用了回溯的例子,在查找路径的时候,如果不回溯,怎么能查到目标路径呢。所以可以说本题也是回溯法。「这道题目有几个难点:」1、一个行程中,如果航班处理不好容易变成一个圈,成为死循环2、有多种解法,字母序靠前排在前面,该如何记录映射关系呢 ?3、使用回溯法(也可以说深搜) 的话,那么终止条件是什么呢?4、搜索的过程中,如何遍历一个机场所对应的所有机场。如何理解死循环这个例子就是说,出发机.原创 2021-05-19 19:16:30 · 231 阅读 · 0 评论 -
来个小结
子集问题分析:时间复杂度:O(n * 2n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2n),构造每一组子集都需要填进数组,又需要O(n),最终时间复杂度:O(n * 2^n)空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n)排列问题分析:时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为原创 2021-05-18 17:48:20 · 62 阅读 · 0 评论 -
全排列
「首先排列是有序的,也就是说[1,2] 和[2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方」。可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示可以看出叶子节点,就是收割结果的地方。那么什么时候,算是到达叶子节点呢?当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。class .原创 2021-05-18 16:57:33 · 57 阅读 · 0 评论 -
递增子序列
1、找到所有该数组的递增子序列。->所以原数组不能进行排序。2、递增子序列的长度至少是 2 。->筛选结果回溯三部曲递归函数参数本题求子序列,很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。终止条件本题收集结果有所不同,题目要求递增子序列大小至少为2单层搜索逻辑可以看出同层上使用过的元素就不能在使用了「本题只要同层重复使用元素,递增子序列就会重复」,而回溯算法:求子集问题(二)中是排序之后看相邻元素是否重复使用。还有一种情况就是如果选取.原创 2021-05-17 18:55:34 · 185 阅读 · 0 评论 -
子集(TX)
思路求子集问题和回溯算法:求组合问题!和回溯算法:分割问题!又不一样了。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,「那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!」其实子集也是一种组合问题,因为它的集合是无序的(顺序怎样都没关系),子集{1,2} 和 子集{2,1}是一样的。「那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!」从图中红线部分,可以看出「遍历这个树的时候,把所有节点都记录下来,就.原创 2021-05-17 16:08:04 · 70 阅读 · 0 评论 -
复原ip地址
思路意识到这是切割问题,「切割问题就可以使用回溯搜索法把所有可能性搜出来」回溯三部曲递归参数在回溯算法:分割回文串中我们就提到切割问题类似组合问题。startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。本题我们还需要一个变量pointNum,记录添加逗点的数量。递归终止条件终止条件和回溯算法:分割回文串情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。pointNum表示逗点数量,pointNum为3说.原创 2021-05-16 17:06:52 · 130 阅读 · 0 评论 -
分割回文串
根据代码随想录的题解总结思路本题涉及到两个关键问题:1、如何切割2、判断是否回文「其实切割问题类似组合问题」。所以我们要利用回溯法来切割字符串。例如对于字符串abcdef:组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中在选取第三个…。切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中在切割第三段…。所以切割问题,也可以抽象为一颗树形结构,如图:递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结.原创 2021-05-16 15:50:24 · 87 阅读 · 0 评论 -
组合总和
本题和回溯算法:组合,回溯算法:求组合总和!和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。本题搜索的过程抽象成树形结构如下:注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!「本题还需要startIndex来控制for循环的起始位置,对于组合问题,什么时候需要startIndex呢?」如果是一个集合来求组合的话,就需要startIndex;如果是多个集合取组合,各.原创 2021-05-15 13:31:44 · 151 阅读 · 0 评论 -
组合
回溯法解决的问题都可以抽象为树形结构(N叉树)那么把组合问题抽象为如下树形结构:可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不在重复取。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。「每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围」。「图中可以发现n相当于树的宽度,k相当于树的深度」。那么如何在这个树上遍历,然后收集到我们要的结果集呢?.原创 2021-05-13 18:12:58 · 186 阅读 · 0 评论 -
回溯算法理论基础
什么是回溯法回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。所以回溯函数也就是递归函数,指的都是一个函数。回溯法的效率回溯法的性能如何呢,虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。那么既然回溯法并不高效为什么还要用它呢?因为没得选,一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法转载 2021-05-13 18:07:26 · 125 阅读 · 0 评论