- 博客(74)
- 收藏
- 关注
原创 力扣面试150题--添加与搜索单词 - 数据结构设计
遍历当前节点的所有非空子节点,对每个子节点递归调用 find 函数,处理剩余字符(start + 1)。如果所有子节点都无法匹配,返回 false。只要找到一条有效路径,立即返回 true。
2025-06-14 12:58:28
24
原创 力扣面试150题--实现Trie(前缀树)
前缀树的作用在于快速检索字符串的前缀,插入一个字符串,即为从根一次插入孩子节点,将字符串最后一个字符对应的节点标记结束节点,再插入另外一个相同前缀但最后n个字符不一样的字符串,那么在相同前缀的部分,不需要插入新的节点,直到第一个不同的字符,添加一个新的子节点。这样做的好处,我们如果要获取两个字符串的前缀,只需要从根节点向下遍历,比较两个字符串,只要到某个节点出现了分支,则这个节点之前的节点就是两个字符的公共前缀。:此时还不了解什么是前缀树,尝试自己实现一下。
2025-06-13 11:37:12
125
原创 力扣面试150题--单词接龙
分析一下,我们进行两两比较字符串的目的是为了找到能一步到达的字符串,那么换种思路,对于一个单词而言,从头到尾修改任意一个字母,都算一步能到达的字符串,于是想到了通配符。双向bfs算法,在之前代码的基础上,不仅从起点往终点搜索,同时从终点向起始搜索,记录变化的距离,直到两者变化到同一种情况,将距离相加即可,结果出现问题了,发现超时了,经过分析后,发现在于构造graph时,每个单词进行两两比较,花费时间过多,因此针对这个点进行优化。t(替换第 2 个字符为!(替换第 3 个字符为!
2025-06-12 17:25:09
304
原创 力扣面试150题--最小基因变化
目的就是将startgene序列转变为endgene序列,每次只能变化一个字符并且变化出来的结果必须是bank里面的结果。
2025-06-10 11:07:58
321
原创 力扣面试150题--蛇梯棋
其他的感觉没啥好说的就是一个简单的宽搜,需要注意的点是,梯子和蛇会跨越传送,这里不一定只往大的值去传送,所以我们需要考虑会不会出现环的问题(这类问题就通过visited数组来记录即可,不要重复访问)。这题的难点在于我们需要将值转化为坐标(蛇形),专门写了一个函数Tohanglie来做这个事情。
2025-06-09 16:09:55
249
原创 力扣面试150题--课程表
初始时,所有入度为 0 的节点都被放入队列中,它们就是可以作为拓扑排序最前面的节点,并且它们之间的相对顺序是无关紧要的。:本质就是将所有前置课程和后置课程作为一个有向图(前者指向后者),判断这个图是否是一个有向无环图(即是否存在拓扑排序)(本质做法是dfs)我们移除 u 的所有出边,也就是将 u 的所有相邻节点的入度减少 1。如果某个相邻节点 v 的入度变为 0,那么我们就将 v 放入队列中。如果答案中包含了这 n 个节点,那么我们就找到了一种拓扑排序,否则说明图中存在环,也就不存在拓扑排序了。
2025-06-08 16:02:55
435
原创 力扣面试150题--被围绕的区域
根据以上中译中,我们可以逆向思维,从边缘的O开始找到与其相连的O,这种岛屿是不需要修改为X,我们将其修改为1,在最后再统一处理,将1改为O,将O改为X。此题的目的在于找到被X包围的O,没有被完全包围(指与边缘的O相连)不算,将完全包围的O变成X。具体找到i相连的岛屿,可以通过深度搜索实现。
2025-06-05 21:24:43
341
原创 力扣面试150题--岛屿数量
一个岛屿是只要1上下左右连接,典型的深搜,如果具体见代码,主要就是得到一个岛屿后,就将1改为2,这样可以节约时间,遍历这个1的上下左右,确定岛屿数量就是通过找1的数目,因为之前为一个岛屿的都改为2了。
2025-06-04 13:17:38
212
原创 力扣面试150题--二叉搜索树的最小绝对差
根据以上简单复习,那么对于这道题而言就很简单了,只需要简单的中序遍历,每个数与前一个数相减(由于性质必为正数),记录下最小的差值即可。(初始差值设置为一个大数字,根节点前设置一个很小的数字,这样根节点前的数就不会影响结果)二叉搜索树是一种特殊的二叉树数据结构,其设计目的是高效地支持数据的搜索、插入和删除操作。它通过对节点值的有序性约束,使得树的结构具有可预测性,从而优化了查找效率。
2025-06-02 10:19:14
192
原创 力扣面试150题--二叉树的锯齿形层序遍历
锯齿形就是一层是从左向右,一层是从右向左,那么我们可以分析样例,对于第奇数层是从左向右,第偶数层是从右向左,于是可以采取一个计数器,采取链表方式,从左向右就是正常插入到链表后面,从右向左就是插入到链表前面。
2025-06-01 14:45:57
305
原创 力扣面试150题--二叉树的层平均值
使用两个队列,一个队列存放树的节点,一个队列存放对应节点的高度,使用x存放上一个节点,highb存放上一个节点的高度,sum存放当前层的节点值之和,num存放当前层的节点数。当出现x节点与队列顶部的节点高度不同时,说明遍历到该层的最后一个元素,计算平均值放入结果集res,清空sum和num。将x指向队列顶部元素,highb指向队列顶部元素的高度,弹出两个队列顶部元素,将x的左右子树放入队列,直到队列为空。当出现x节点与队列顶部的节点高度相同时。以上是判断时做的,以下是判断完做的。
2025-05-30 15:23:56
459
原创 力扣面试150题--二叉树的右视图
采取层序遍历,利用一个high的队列来保存每个节点的高度,highb和y记录上一个节点的高度和节点,在队列中,如果队列中顶部元素的高度大于上一个节点的高度,说明上一个节点就是上一层中最右边的元素,加入数组即可,同时最后需要处理最后一个元素,因为最后一个元素没有能比较的了,需要手动加入数组。
2025-05-29 15:29:08
277
原创 力扣面试150题--二叉树的最近公共祖先
我们可以用哈希表存储所有节点的父节点,然后我们就可以利用节点的父节点信息从 p 结点开始不断往上跳,并记录已经访问过的节点,再从 q 节点开始不断往上跳,如果碰到已经访问过的节点,那么这个节点就是我们要找的最近公共祖先。初次思路:转化为中序和后序来找祖先,具体见代码。
2025-05-28 23:33:47
431
原创 力扣面试150题--完全二叉树的节点个数
2. 如果不等说明右子树是深度小于左子树的满二叉树, 然后进一步判断左子树的节点数(最后一层最后出现的节点必然在左子树中。1. 如果相等说明左子树是满二叉树, 然后进一步判断右子树的节点数(最后一层最后出现的节点必然在右子树中)
2025-05-27 09:00:03
303
原创 力扣面试150题--二叉搜索树迭代器
迭代做法,我们知道取得中序遍历可以通过栈来实现,那么就把中序遍历采取非递归写法,每次获取下一个节点,就从栈中取出一个节点,并且处理它后面需要压入栈的节点处理了。这样就满足了进阶的空间复杂度。:想的比较简单,在构造这个类的时候,直接求出中序遍历,存放在一个数组中,维护一个序号,当然这个不满足进阶做法的空间复杂度,因为需要保存中序遍历的所有值。
2025-05-26 14:50:14
342
原创 力扣面试150题--求根节点到叶节点数字之和
我们利用sum这个全局变量来保存总和值,递归函数sum来计算每个根到叶子节点路径所代表的数,由于我们需要遍历到每条根到叶子节点的路径,所有我采取了前序遍历,如果不是叶子节点,就计算到该节点代表的值,就是qian*10+当前节点的值,qian的意思就是根到这个节点路径上的值(代表的数),到根节点就先获取到这个值,然后加到sum即可。
2025-05-24 14:41:59
367
原创 力扣面试150题--路径总和
这题比较简单,我们只需要判断从该节点出发,向他的左孩子和右孩子遍历,如果节点为null,就返回false,每遍历一层,就将目标值减去当前节点的值,如果到叶子节点正好减为0,就返回true,其他情况需要判断递归左边和递归右边是否有返回true,能返回一个true就算成功。
2025-05-23 10:35:37
288
原创 力扣面试150题-- 二叉树展开为链表
对于当前节点,如果其左子节点不为空,则在其左子树中找到最右边的节点,作为前驱节点,将当前节点的右子节点赋给前驱节点的右子节点,然后将当前节点的左子节点赋给当前节点的右子节点,并将当前节点的左子节点设为空。对当前节点处理结束后,继续处理链表中的下一个节点,直到所有节点都处理结束。
2025-05-22 12:30:49
334
原创 力扣面试150题--填充每个节点的下一个右侧节点指针 II
如果我们采取前序遍历,在遍历到第四层的0这个点时,需要指向右边第一个节点,也就是8,但是此时它的父亲节点指向9,但是9并没有指向1,原因在于,我们并没有遍历到右子树的9号节点,因此此时0的next会指向null。所以我们考虑遍历顺序变为根右左,先处理右子树,这样处理的好处是,由于每个节点都是不断指向右边的节点,先处理右子树,就会先处理好右子树的next,不会出现以上情况。:直接采取层序遍历(居然没想到)
2025-05-21 10:50:18
392
原创 力扣面试150题-- 从中序与后序遍历序列构造二叉树
(左子树)(右子树)(根),那么我们直接修改昨天的代码即可。前序是从前向后找根,后序我们就从后向前找根。
2025-05-20 10:07:35
312
原创 力扣面试150题--从前序与中序遍历序列构造二叉树
由于我们取得根节点的值很容易,但是在中序遍历中找到这个根节点的序号很困难,于是事先用一个map(indexmap)存放每个节点对应的序号(这里主要是无重复元素)。首先复习一下前序遍历和中序遍历,好的这道题理解到这点就够,
2025-05-19 15:52:30
511
原创 力扣面试150题--反转链表 II
首先解释一下如何原地反转链表,就题目所示。1-》4-》3-》2-》5,就完成了反转。然后将1指向4 2指向5。将2,3,4进行反转。
2025-04-27 11:20:43
194
原创 力扣面试150题--合并两个有序链表和随机链表的复制
常规题目,比较list1和list2节点的值,取出较小值扩展链表,最后其中一个遍历完直接拼接另外一个即可(归并排序)
2025-04-26 12:59:32
240
原创 力扣面试150题--基本计算器
具体思路就是展开所有的括号,由于只有±两个运算符号,它们拆开括号的效果如下,比如1+(1+2)=1+1+2;1-(1+2)=1-1-2,所以可以使用1和-1来表示加和减,具体做法如下。我的做法如下:根据前面逆波兰表达式求值,可以考虑将这个正常的表达式先转化为逆波兰表达式,再用逆波兰表达式进行求值。:代码阅读性差,并且时间复杂度比较高。:此题我遇到了几个难点。
2025-04-24 11:55:28
839
原创 力扣面试150题--最小栈和逆波兰表达式求值
经典题目,当出现数字时,压入栈,出现运算符号,弹出栈顶两个元素,计算后再压入栈,直到遍历完字符串数组,栈顶元素就是计算结果。由于是字符串数组,直接使用Integer.parseInt()转化为整型即可。
2025-04-23 11:43:11
232
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人