回溯
c葱c
这个作者很懒,什么都没留下…
展开
-
N皇后 (回溯)
一维:for循环取元素,递归也是用来取元素的(分为可以重复取和不能重复取。单层搜索:在for循环中,判断当前位置放 Q 是否合法,合法就放入,然后进行递归。二维: for循环控制列,递归控制行。这里就显示出来一维和二维的区别。终止条件:当遍历完所有行(row) 时,就收集结果集。参数:n, row,chessboard。for循环是遍历 col。在二维的数组下进行搜索。原创 2023-04-13 10:23:42 · 20 阅读 · 0 评论 -
组合、子集、排序的区别
从三个方面进行区分。1. 参数2. 终止条件3.单层搜索。原创 2023-04-12 10:43:44 · 93 阅读 · 0 评论 -
leetcode 47.全排列 II
多了个树层去重:和之前的做法一样,加一个 used 数组。,把相同的数字都放在一块,方便去重。原创 2023-04-12 10:08:54 · 28 阅读 · 0 评论 -
leetcode 46.全排列
之前判断的是 used[ i ] == false ,判断的是树层上的去重。树枝不需要判断去重,因为每次循环的开始都是 startIndex。而 startIndex 在上一层就被 + 1 ,所以不可能会取到取过的元素。1. 不用startIndex,也就是说,{1, 2} {2 , 1} , 是可以同时存在的,也就是循环每次都头从开始。2. 但正因为从头开始,就需要对使用过的元素进行标记了,不然每次都会加入重复的数据。题目说了,不含重复数字,也就不需要对树层去重。原创 2023-04-12 09:23:02 · 23 阅读 · 0 评论 -
leetcode 491.递增子序列
b. 和之前不一样,之前是判断是否为 false ,之前是判断同一层树层,因为之前的used是全局变量,需要管所有的层。所以那个时候如果 used[i] == false ,表示已经回溯到了树层,而不是在树枝上。当递归到下一层的时候,又是一个新的set。a.注意,这里的nums[i] 可能会有负数,所以 下标按照 + 100的偏移量去做。这里的去重和之前一样,对数组进行重新排序,所以不能用标记数组的方式来去重。如果path不为空,且已经加入的元素 比 之后要加入的元素大,说明不符合递增条件。原创 2023-04-12 09:02:18 · 34 阅读 · 0 评论 -
leetcode 90.子集II
个人的理解是:当 i == startIndex ,就是树枝迭代。一种不用used去重的方法。原创 2023-04-11 15:39:45 · 23 阅读 · 0 评论 -
leetcode 78.子集
同时注意,集合:是无序的。也就是 {1 ,2} == {2 , 1 },因为收集的是树形结构中的所有结点。原创 2023-04-11 15:20:05 · 23 阅读 · 0 评论 -
leetcode 93.复原IP地址
思路:和分割回文串差不多。1. 参数多加了一个 pointSum,来记录已经加了多少个 "."2. 终止条件当 pointSum == 3 时,代表已经加入了 三个 点,说明无需再分割了。之后需要再对第四段进行判断。因为前面三段都是先判断后加点,最后一段就需要单独判断,最后再将整个字符串加入结果集中。3.单层搜索和分割回文串是一样的,如果是合法的子串,就进行处理。这里不同的是:1. 如果是合法的子串,就在(添加的是字符,而不是字符串!!!!!!!)之后再回溯回来。原创 2023-04-11 10:51:13 · 35 阅读 · 0 评论 -
leetcode 131.分割回文串
先判断子串是否回文,如果回文就进行下一步的搜索,如果不是就下一个循环(也就是切割线向下一位移动。参数,string s,int startIndex(表示切割的位置到哪了。终止条件,当切割到整个字符串的最后,就表示结束,可以进行收割了。3. 回文串,用双指针来判断(一开始还以为要用栈。说起来是和组合差不多,但是我觉得真的。原创 2023-04-10 15:41:58 · 46 阅读 · 0 评论 -
leetcode 40.组合总和II
used 是一个 bool 类型的数组。true 表示元素已经用过了, false 表示元素没有使用过。没想到可以多用一个数组来表示去重。我一开始的逻辑是用一些API来转换。去重的判断应该写在 单层逻辑之前。这里去重的逻辑判断很有意思!思路:一样,多了去重的逻辑。原创 2023-04-10 11:53:49 · 28 阅读 · 0 评论 -
leetcode 39. 组合总和
2. 判断下一层是不是已经超过了 target。,还有循环递归中的参数是。1. 需要先对数组排序。原创 2023-04-10 10:41:14 · 22 阅读 · 0 评论 -
leetcode 17.电话号码的字母组合
但循环 其实 也是 在 i == size 之后,停止的,因为每次操作完之后 i 会 ++。所以当最后一次比较的时候,i 其实 == size 的。但这里递归的终止条件是 i == size。我认为是,当 i == size 之后,本来就没对 string 函数进行任何操作了,只是把path 加入 res,最后返回。index 就是用来遍历 string digits 的,这个大小 需要和 digits.size() 是比较。2.将遍历到的字符串 digits ,的字符串,转化为数字。原创 2023-04-08 10:39:46 · 28 阅读 · 0 评论 -
leetcode 216.组合总和III
思路和之前差不多,无非就是求个和,不过我这里求和做复杂了。其实可以在下面的循环中就可以求。二一个是 对上一题 77 题的组合,剪枝理解得不够深入!一个是没想到 和大于了之后可以直接剪,这里 i 的取值都是意味着一个区间的。再来一遍看题解之后的修改!原创 2023-04-08 09:37:36 · 32 阅读 · 0 评论 -
leetcode 77. 组合
day24今天开启回溯章节咯!回溯和递归密不可分!回溯三部曲:(个人感觉和递归差不多)1. 确定返回值和参数这里的返回值一般都是 void参数 一开始可能不能完全确定下来,所以需要用到哪些,就把哪些写上2.终止条件一般在终止条件中收割结果,然后 return掉3.单层的逻辑一般是先是个for循环,然后在for循环里面继续递归回溯其实就是依靠一个for循环 和 递归 形成了一个N 叉树的结构。原创 2023-04-07 10:21:10 · 25 阅读 · 0 评论