
刷题记录
文章平均质量分 68
此专栏记录本人的刷题记录,计划主要以灵神题单,代码随想录,hot100和剑指Offer为主
为了前进而后退,为了走直路而走弯路
https://darling-123456.github.io/个人博客网站,欢迎访问
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Day136 | 灵神 | 回溯算法 | 子集型 串联字符串的最大长度
用选或不选这个思路,会让思路变得非常简单。具体来说就是看选不选当前的字符串,选的话长度加上当前字符串,不选的话就递归下一个字符串选或不选。在于 我们决定要选当前字符串的情况下,我们能不能选当前字符串,即看这个字符串和已经选了的有没有重复,除此之外还要看组内有没有重复的。遍历字符串,如果在之前选的里面没出现过,对应字符++,如果有字符出现过,那代表我们都将不能选这个字符串,所以直接break。下面就是字符串不能选的情况,因为hash数组是全局变量,所以还得给它加了的给减回去,所以才有下面的for循环。原创 2025-06-30 12:04:20 · 338 阅读 · 0 评论 -
Day135 | 灵神 | 回溯算法 | 子集型 烹饪料理
笔者用的是选或不选的思路,即看第 i种选或不选,如果食材足够就选(choicei进行判断),如果食材不足就不选,直接去看i+1选或不选。选的话就把食材饱腹感美味度给修改了,不选的话就直接递归就行。原创 2025-06-27 11:08:22 · 135 阅读 · 0 评论 -
Day134 | 灵神 | 回溯算法 | 子集型 字母大小写全排列
这道题用选或不选的思路来解答。选或不选说的不是选或不选s字符串中的某个字符,而是选或不选改变s字符串中字符的大小写如果是数字的话就不用说了,我们直接输入到path就行如果是字母的话,那就有两种情况1.选择不改变其大小写直接输入到path,这种就是原来什么样子现在还什么样2.选择改变其大小写直接输入到path,这种就是改变了大小写以后放进去的需要注意的点:对于同一个结点有多个状态,比如这道题,在选择字母a之后,字母a还有两个状态一个改变大小写一个不改变。原创 2025-06-26 09:38:37 · 434 阅读 · 0 评论 -
Day133 | 灵神 | 回溯算法 | 子集型 二叉树的所有路径
这道题思路比较简单,直接写就行。原创 2025-06-25 16:24:51 · 172 阅读 · 0 评论 -
Day131 | 灵神 | 回溯算法 | 子集型 子集
笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧。原创 2025-06-10 17:18:33 · 184 阅读 · 0 评论 -
Day130 | 灵神 | 回溯算法 | 子集型 电话号码的字母组合
灵神没有"恢复现场"这一步,是因为灵神把path初始化为全0的字符串,并且在递归中直接覆盖了对应的值,而恰巧字符串返回时的长度全都是digits数组的长度,所以把path放入结果集的时候肯定path数组都会被覆盖一遍。3.下一个子问题:构造字符串>=index+1的部分,就是说明我们下一层的递归参数是index+1,因为我们已经在本层的字母中选择了一个,所以要继续往下走了,表现在数组上就是继续往下遍历digits。映射的建立,下标要对上数字,也就是让映射的数组从下标2开始而不是0,这样会方便很多。原创 2025-06-05 20:50:13 · 410 阅读 · 0 评论 -
Day129 | 灵神 | 二叉树 | 二叉树的堂兄弟节点II
而我们把所有结点的和加起来以后,再减去 4的左右孩子的值,那剩下的不就是9的左右孩子的值吗。为什么要算和是多少呢?因为我们要知道4的左右孩子的值是多少就必须知道9的左右孩子的和。算一下就是 10+1+7=18,这是第三层节点的和 4的左右孩子和是11,9的是7。那么4的左右孩子的值就是 18-1-10=7,而9的左右孩子就是18-7=11了。要算第三层,就要考虑第二层,当我们还在遍历第二层的时候,就把第二层的节点存起来。然后遍历一次第二层节点得到 第三层节点的和 10+1+7=18。原创 2025-05-29 20:22:56 · 283 阅读 · 0 评论 -
Day128 | 灵神 | 二叉树 | 反转二叉树的奇数层
层序遍历的话就交换对应节点的值吧,就如果是奇数层的话,就把节点都弄到vector里面,然后反转节点的值。原创 2025-05-27 23:23:24 · 310 阅读 · 0 评论 -
26考研 | 王道 | 第五章 传输层
比如下图中,乱序到达了20,21,22,这时候不可以把这个数据交付给应用程序,因为18和19还没到,不可以称之为有序。原创 2025-05-27 11:27:59 · 1891 阅读 · 0 评论 -
Day127 | 灵神 | 二叉树 | 奇偶树
但是很显然这个是有问题的,因为我这里是用当前结点和队头元素进行比较,那我当前这一层的节点就有可能和下一层的节点进行比较,这是明显的错误,因为下一层的奇数或者偶数和本层的奇数或者偶数没有关系,所以导致了错误。这道题用层序遍历的思路比较好想,就是往for循环里面加一个if,如果是奇数层就判断是不是偶数并且递减,如果是偶数层就判断是不是奇数并且递增,会很直接的写下如下所示的代码。原创 2025-05-26 15:17:24 · 267 阅读 · 0 评论 -
Day126 | 灵神 | 二叉树 | 层数最深的叶子结点的和
用深度优先也可以,传一个参数是深度,当深度最大的时候才会把当前结点的值加入到res中。这道题用层序遍历的思路比较好想,就把每层的都算一下,然后返回最后一层的和就是了。原创 2025-05-24 23:56:20 · 537 阅读 · 0 评论 -
Day125 | 灵神 | 二叉树 | 二叉树中的第K大层和
把每层的结果都放到一个vector数组里面,然后排序这个vector数组,返回第K大的元素即可。原创 2025-05-23 18:01:45 · 359 阅读 · 0 评论 -
Day124 | 灵神 | 二叉树 | 二叉树最小深度
就是我们找到的第一个叶子节点,它的深度就是树的最小的深度。之前都是递归写法,这次写层序遍历。原创 2025-05-22 23:38:33 · 258 阅读 · 0 评论 -
Day123 | 灵神 | 二叉树 | 找树左下角的值
我的思路就是在每层的循环前加个判断,把res更新队头元素,队头肯定是最左边的。灵神思路是先入队右孩子再入队左孩子,这样最后一个出队的肯定是最左边的。初学者可以看灵神视频。原创 2025-05-21 23:08:25 · 233 阅读 · 0 评论 -
Day122 | 灵神 | 二叉树 | 二叉树的层序遍历 二叉树的锯齿状遍历
笔者写过很多次了这里不再赘述,初学者可以看灵神视频。原创 2025-05-20 19:04:48 · 174 阅读 · 0 评论 -
Day121 | 灵神 | 二叉树 | 二叉搜索树的最近共公共祖先
笔者第一次做不会做,下面是灵神的思路。注意使用的是后序遍历,因为我们需要叶子结点给上层结点反馈信息一个重要的思想是把叶子节点所连接的两个空节点看做是叶子结点推荐先把做了,对理解本题做法有帮助本题最深的叶子可能只有一个,此时这个叶子就是答案。如果最深的叶子不止一个,那么答案为最深叶子的最近公共祖先。原创 2025-05-19 19:29:33 · 402 阅读 · 0 评论 -
Day120 | 灵神 | 二叉树 | 二叉搜索树的最近共公共祖先
3.如果不是以上两种情况,那只能是q和p分别在左右子树中,那么当前结点肯定是最近公共祖先了,就返回当前结点就行。1.如果q和p的值都是小于当前结点值的,那说明q和p肯定都在左子树,那他们的最近公共祖先肯定在左子树中。2.如果q和p的值都是大于当前结点值的,那说明q和p肯定都在右子树,那他们的最近公共祖先肯定在右子树中。我们可以利用搜索树性质来查找q和p的最近公共祖先。这道题是236的一种特殊情况。原创 2025-05-17 21:25:19 · 303 阅读 · 0 评论 -
Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先
但是,在递归过程中,返回值可能是最近公共祖先,也可能是空节点(表示子树内没找到任何有用信息)、节点 p 或者节点 q(可能成为最近公共祖先,或者用来辅助判断上面的某个节点是否为最近公共祖先)。3.如果左右子树都有的话,也就是pq分别在这当前结点的左右子树,那么最近公共祖先就是当前结点。4.如果只在左子树中找到了q或者p,那说明最近公共祖先肯定在左子树,返回遍历左子树的结果就行。比如5是p,4是q,那么我们遍历到5就直接返回5就行,因为5是5和4的最近公共祖先。2.当前结点是p或者q,直接返回当前结点就行。原创 2025-05-17 21:24:38 · 471 阅读 · 0 评论 -
Day118 | 灵神 | 二叉树 | 删点成林
很可惜这样是错的,因为这样做只是删除了当前结点,没有改变当前结点父节点的指针,导致父节点的里面还放着我们已经delete以后的地址空间,这样做漏洞很大。最直接的思路就是看当前结点的值是不是在要删除的列表中,在的话删除当前结点并把左右孩子加入res中。如果当前结点该删除,那就给上层节点返回nullptr,告知父节点该节点被删了。如果当前结点没有被删除,那就给上层结点返回当前结点,表示当前结点没有被删除。正确的做法是后序遍历,返回值是当前结点删了没删。 同时还要把不为空的左右孩子加入到森林中。原创 2025-05-15 23:22:15 · 234 阅读 · 0 评论 -
Day117 | 灵神 | 二叉树 | 二叉搜索树的最大键值和
笔者第一次写是用bool返回子树是否是二叉搜索树,只要左右子树是,那就把本节点的值给加上了,所以出错了,因为左右子树都是二叉搜索树不能说算上当前结点也是二叉搜索树。只要不是二叉搜索树,那和就是0,只要是那就是左右子树之和再加本节点的值,再和当前的最大值取一个最大值,就是结果,然后继续向上返回。hard题,思路倒也简单,就是后序遍历,判断这棵树是不是二叉树并且自底向上计算这棵子树的和,然后更新最大值。所以递归函数意义就是向上返回左右边界的当前子树的和,左右边界用来判断是否二叉搜索树,和用来找最大值。原创 2025-05-14 10:35:07 · 375 阅读 · 0 评论 -
Day115 | 灵神 | 二叉树 | 二叉搜索树中的众数
用MaxCnt记录最大值,用Cnt表示当前结点值的频率,用pre记录前一个节点。二叉搜索树中序遍历是有序的,收入到一个vector中对这个升序数组进行处理。遍历一遍,然后用map统计频率,最后对value排序,选出最大的。如果Cnt大于MaxCnt的话就把MaxCnt更新为Cnt。如果不相等那么Cnt重新置为1,表示当前结点t是一个新值。如果当前结点和前一个结点的值相等,那就Cnt++如果二者相等的话就把当前结点的值放入结果集中。,那就是中序遍历过程中动态统计频率。原创 2025-05-10 08:59:24 · 531 阅读 · 0 评论 -
Day114 | 灵神 | 二叉树 | 二叉搜索树的最小绝对差
这道题目拿到手就觉得在树中递归查找太费劲了,还是转化为有序数组在数组中使用二分比较方便。2.二分查找queries[i]即可找到最大最小值。1.中序遍历root得到有序数组arr。原创 2025-05-09 13:15:59 · 234 阅读 · 0 评论 -
C++ 中 lower_bound 与 upper_bound 函数详解
关键区别检查元素是否存在结合 的返回值与目标值比较:统计元素出现次数使用 计算区间跨度:自定义排序规则支持传入比较函数,处理复杂数据结构或非默认排序:插入元素保持有序性在有序容器中插入新元素时,确定插入位置四、注意事项与常见误区必须保证序列有序迭代器越界检查自定义比较函数的一致性等价元素的处理差异若需获取所有等价元素的范围,建议使用equal_range(返回lower_bound和upper_bound的 pair 结果)六、总结 和 是处理有序序列的核原创 2025-05-09 13:15:04 · 2172 阅读 · 0 评论 -
Day113 | 灵神 | 二叉树 | 二叉搜索树的最小绝对差
easy题目,中序遍历是有序的,最小绝对差肯定是相邻的。原创 2025-05-08 13:05:08 · 223 阅读 · 0 评论 -
Day112 | 灵神 | 二叉树 | 二叉搜索树的范围和
1.当前结点值大于high的值说明右子树的所有值在范围外,只搜索左子树。2.当前结点值小于low的值说明左子树的所有值在范围外,只搜索右子树。最直接的思路当然是直接前序遍历一遍,碰到在一个区间的就加到和里面。加上二叉搜索树的性质就是用后序遍历来写,递归函数返回值就。3.在范围内那么左右子树都得继续搜索,返回三者的和。原创 2025-05-07 10:31:49 · 156 阅读 · 0 评论 -
Day111 | 灵神 | 二叉树 | 验证二叉搜索树
二叉树搜索树的中序遍历是一个有序序列,记录前一个值,如果当前结点的值比前一个值小就是false。递归函数传入合法的左右边界,只有当前结点是合法的边界,才是二叉搜索树,否则就返回false。对于左子树就传入当前结点的左边界,和当前结点的值作为右边界,从而验证左子树是一颗二叉搜索树。对于右子树就传入当前结点的右边界,和当前结点的值作为左边界,从而验证右子树是一颗二叉搜索树。只有当前结点符合条件并且左右子树也都是二叉搜索树才会返回true。原创 2025-05-06 12:19:46 · 701 阅读 · 0 评论 -
Day110 | 灵神 | 二叉树 | 根到叶路径上的不足节点
笔者一开始没看懂,只能通过部分的例子,原因是把路径和小于limit的都给删了,但是如果留有左右节点其中一个的话就不能删。原创 2025-05-04 13:51:46 · 384 阅读 · 0 评论 -
Day109 | 灵神 | 148.排序链表 | 归并排序
以下是灵神的题解,笔者认为这题只要可以看懂就好了两种方法:分治和迭代。原创 2025-05-03 18:00:23 · 750 阅读 · 0 评论 -
Day108 | 灵神 | 合并两个有序链表
谁小就把谁接到当前结点的后面,然后返回当前结点作为合并后的结果。如果其中一个链表为空,直接返回另一个链表作为合并后的结果。这是道easy题,直接写就行。原创 2025-05-02 14:07:42 · 189 阅读 · 0 评论 -
Day107 | 147.对链表进行插入排序 | 简单选择、冒泡、直接插入
147题直接用插入排序就可以解决,只是想着顺手总结一下。原创 2025-05-01 09:04:47 · 468 阅读 · 0 评论 -
Day106 | 灵神 | 二叉树 二叉树中的最长交错路径
这道题挺难想的,笔者第一次写,没写出来,原因是情况少了,只考虑可以往左的时候往左和可以往右走的时候往右,少了不可以往左的时候往左和不可以往右的时候往右走。flag为0,这说明我们可以往左走,然后下一层的递归函数就不可以往左走只可以往右走,所以传入1,并且长度为原来长度加上本层节点就是len+1。flag为1,那说明我们可以往右走,然后下一层的递归函数就不可以往右走只能往左走,所以传入0,并且长度为原来长度加上本层节点就是len+1。r=0的原因是,我们是走的左子树,所以从右子树去的路径长度就归0了。原创 2025-04-30 11:17:15 · 620 阅读 · 0 评论 -
Day105 | 灵神 | 二叉树 出现次数最多的子树元素和
思路就是递归函数的返回值是最大值和最小值的组成的二元组,从下往上返回最大值和最小值,同时计算对于本层节点来说的最大值和最小值去更新res。假如我的最大值或者最小值在左子树,此时我已经遍历到右子树了,那么不会出现A,B两个节点谁都不是谁的祖先吗。如果作为形参,那么每一层的最大值和最小值都是这一层的,回到根节点的时候也就回溯回去了。核心其实就是要维护遍历过程中的最大值和最小值,然后和本层的结点做减法找到最大值即可。这就是搞混了形参和全局变量在递归中的变化导致的。如果是全局变量的话才有可能是上面的那种情况。原创 2025-04-29 09:37:20 · 272 阅读 · 0 评论 -
Day104 | 灵神 | 二叉树 出现次数最多的子树元素和
思路就是遍历一遍二叉树然后用map给它的频率都记录下来,再对频率排序,把最大的输出到一个vector里面返回就是了。注意:C++的map不能直接对sort使用lambda实现对value的排序,需要先把map转化为。原创 2025-04-28 09:31:40 · 201 阅读 · 0 评论 -
Day103 | 灵神 | 二叉树 计算布尔二叉树的值
本题思路很直接,就是直接写,分情况讨论就好。似乎根本不用判断节点是否为空。原创 2025-04-27 08:54:45 · 185 阅读 · 0 评论 -
Day102 | 灵神 | 二叉树 合并二叉树
4.如果root1当前结点不为空,而root2也不为空的话,那就把这两个结点的val相加作为当前结点t的val然后返回即可。1.如果root1当前结点不为空,而root2为空的话,那就返回root1作为上层递归函数的结点t的左子树或者右子树。2.如果root2当前结点不为空,而root1为空的话,那就返回root2作为上层递归函数的结点t的左子树或者右子树。3.如果root1当前结点为空,而root2也为空的话,那就返回nullptr。就是新建一个结点,然后找到左右子树给接上去把该节点返回就是了。原创 2025-04-26 11:49:38 · 265 阅读 · 0 评论 -
Day101 | 灵神 | 二叉树 翻转等价二叉树
那我还翻转什么了,直接把这两种情况都递归一下,第一次比较左左和右右,第二次比较左右和右左,只要有一次可以比较成功那就是可以翻转,根本不用什么swap。一开始笔者的思路就是判断完当前结点相不相等以后再去判断左右子树相不相等,不相等的话用swap翻转之后再次比较,这样太麻烦了,而且写的时候难免出错。情况2:需要翻转,也就是没有翻转之前root1的左子树和root2的右子树相同,root1的右子树和root2的左子树相同。情况1:不需要翻转,也就是root1的左子树和root2的左子树相同,右子树和右子树相同。原创 2025-04-25 10:11:45 · 327 阅读 · 0 评论 -
Day100 | 灵神 | 二叉树 单值二叉树
笔者的思路是后序遍历传入两参数,一个是节点另一个是单值的值,只要一样就是true,不一样就是false,缺点是如果当然节点已经不满足条件了,还是会处理完左右子树再来处理根节点。也可以先序遍历,就是先判断是不是是不是val,是的话就不处理下面的左右子树了。用的是前序遍历,也就是dfs。leetcode的官方题解。原创 2025-04-24 08:28:29 · 296 阅读 · 0 评论 -
Day99 | 灵神 | 二叉树 二叉树的右视图
笔者的思路并不敏捷,所以第一时间只能想到层序遍历,然后把每层的最后一个给放到数组里面去。按照根右左的顺序遍历,只要当前结点的深度是第一次遍历到,那必然是最右侧的节点。找左视图的话那肯定就是根左右的顺序遍历了。原创 2025-04-23 08:42:37 · 262 阅读 · 0 评论 -
Day97 | 灵神 | 二叉树 对称二叉树
这一题的对称就是左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树对比。和上一题的区别就是在p和q值相同的时候递归遍历的下一棵子树不同。上一题是左子树和左子树,右子树和右子树对比。原创 2025-04-21 08:17:13 · 162 阅读 · 0 评论 -
Day96 | 灵神 | 二叉树 相同的树
就是个easy题没啥好说的,就是遍历就行。原创 2025-04-20 15:30:31 · 213 阅读 · 0 评论