- 博客(58)
- 收藏
- 关注
原创 力扣面试150题--二叉树的最近公共祖先
我们可以用哈希表存储所有节点的父节点,然后我们就可以利用节点的父节点信息从 p 结点开始不断往上跳,并记录已经访问过的节点,再从 q 节点开始不断往上跳,如果碰到已经访问过的节点,那么这个节点就是我们要找的最近公共祖先。初次思路:转化为中序和后序来找祖先,具体见代码。
2025-05-28 23:33:47
85
原创 力扣面试150题--完全二叉树的节点个数
2. 如果不等说明右子树是深度小于左子树的满二叉树, 然后进一步判断左子树的节点数(最后一层最后出现的节点必然在左子树中。1. 如果相等说明左子树是满二叉树, 然后进一步判断右子树的节点数(最后一层最后出现的节点必然在右子树中)
2025-05-27 09:00:03
165
原创 力扣面试150题--二叉搜索树迭代器
迭代做法,我们知道取得中序遍历可以通过栈来实现,那么就把中序遍历采取非递归写法,每次获取下一个节点,就从栈中取出一个节点,并且处理它后面需要压入栈的节点处理了。这样就满足了进阶的空间复杂度。:想的比较简单,在构造这个类的时候,直接求出中序遍历,存放在一个数组中,维护一个序号,当然这个不满足进阶做法的空间复杂度,因为需要保存中序遍历的所有值。
2025-05-26 14:50:14
267
原创 力扣面试150题--求根节点到叶节点数字之和
我们利用sum这个全局变量来保存总和值,递归函数sum来计算每个根到叶子节点路径所代表的数,由于我们需要遍历到每条根到叶子节点的路径,所有我采取了前序遍历,如果不是叶子节点,就计算到该节点代表的值,就是qian*10+当前节点的值,qian的意思就是根到这个节点路径上的值(代表的数),到根节点就先获取到这个值,然后加到sum即可。
2025-05-24 14:41:59
312
原创 力扣面试150题--路径总和
这题比较简单,我们只需要判断从该节点出发,向他的左孩子和右孩子遍历,如果节点为null,就返回false,每遍历一层,就将目标值减去当前节点的值,如果到叶子节点正好减为0,就返回true,其他情况需要判断递归左边和递归右边是否有返回true,能返回一个true就算成功。
2025-05-23 10:35:37
275
原创 力扣面试150题-- 二叉树展开为链表
对于当前节点,如果其左子节点不为空,则在其左子树中找到最右边的节点,作为前驱节点,将当前节点的右子节点赋给前驱节点的右子节点,然后将当前节点的左子节点赋给当前节点的右子节点,并将当前节点的左子节点设为空。对当前节点处理结束后,继续处理链表中的下一个节点,直到所有节点都处理结束。
2025-05-22 12:30:49
326
原创 力扣面试150题--填充每个节点的下一个右侧节点指针 II
如果我们采取前序遍历,在遍历到第四层的0这个点时,需要指向右边第一个节点,也就是8,但是此时它的父亲节点指向9,但是9并没有指向1,原因在于,我们并没有遍历到右子树的9号节点,因此此时0的next会指向null。所以我们考虑遍历顺序变为根右左,先处理右子树,这样处理的好处是,由于每个节点都是不断指向右边的节点,先处理右子树,就会先处理好右子树的next,不会出现以上情况。:直接采取层序遍历(居然没想到)
2025-05-21 10:50:18
383
原创 力扣面试150题-- 从中序与后序遍历序列构造二叉树
(左子树)(右子树)(根),那么我们直接修改昨天的代码即可。前序是从前向后找根,后序我们就从后向前找根。
2025-05-20 10:07:35
302
原创 力扣面试150题--从前序与中序遍历序列构造二叉树
由于我们取得根节点的值很容易,但是在中序遍历中找到这个根节点的序号很困难,于是事先用一个map(indexmap)存放每个节点对应的序号(这里主要是无重复元素)。首先复习一下前序遍历和中序遍历,好的这道题理解到这点就够,
2025-05-19 15:52:30
503
原创 力扣面试150题--反转链表 II
首先解释一下如何原地反转链表,就题目所示。1-》4-》3-》2-》5,就完成了反转。然后将1指向4 2指向5。将2,3,4进行反转。
2025-04-27 11:20:43
191
原创 力扣面试150题--合并两个有序链表和随机链表的复制
常规题目,比较list1和list2节点的值,取出较小值扩展链表,最后其中一个遍历完直接拼接另外一个即可(归并排序)
2025-04-26 12:59:32
234
原创 力扣面试150题--基本计算器
具体思路就是展开所有的括号,由于只有±两个运算符号,它们拆开括号的效果如下,比如1+(1+2)=1+1+2;1-(1+2)=1-1-2,所以可以使用1和-1来表示加和减,具体做法如下。我的做法如下:根据前面逆波兰表达式求值,可以考虑将这个正常的表达式先转化为逆波兰表达式,再用逆波兰表达式进行求值。:代码阅读性差,并且时间复杂度比较高。:此题我遇到了几个难点。
2025-04-24 11:55:28
831
原创 力扣面试150题--最小栈和逆波兰表达式求值
经典题目,当出现数字时,压入栈,出现运算符号,弹出栈顶两个元素,计算后再压入栈,直到遍历完字符串数组,栈顶元素就是计算结果。由于是字符串数组,直接使用Integer.parseInt()转化为整型即可。
2025-04-23 11:43:11
228
原创 力扣面试150题--有效的括号和简化路径
首先对于这个给出的字符串,有用的信息即为文件名(包括。),我的想法是创建一个栈,依次取出文件名加入到栈中,依次弹出栈后单独处理/即可。:此题难点在于如何处理返回上一级文件夹,而且可能出现/d/c/./b/。/a这种情况,需要连续返回两个文件夹.(结果应该返回/d/a)
2025-04-22 11:14:54
321
原创 力扣面试150题--插入区间和用最少数量的箭引爆气球
初次思路:借鉴一下昨天题解的思路,将插入的区间与区间数组作比较,插入到升序的数组中,其他的和(合并区间)做法一样。注意需要特殊处理一下情况,插入区间比数组中最后一个区间的起始点大,这种情况,在循环中不会计算到插入区间,单独处理一下。问题:时间复杂度比较高,虽然通过了做法:注意题目条件,给定的区间数组中的区间是不重叠的,那么我们需要插入一个新的区间,只需要找到这个与这个插入区间有重叠的区间,合并成一个大区间即可。题目描述首先我们来中翻中一下:这题所谓的最少数量的箭,可以理解为多个区间中的重叠的区间,
2025-04-21 14:27:05
345
原创 力扣150题-- 汇总区间和合并区间
按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的。如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组 merged 的末尾;否则,它们重合,我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点,将其置为二者的较大值。:对于两个范围是否能够合并,有以下几种情况用范围(a,b)和(a1,b1)表示。
2025-04-20 13:54:12
290
原创 力扣面试150题-- 存在重复元素 II和最长连续序列
以上做法,虽然通过,但是我的时间复杂度很高,我感觉原因在于TreeSet的插入和遍历效率太低了,看过。
2025-04-19 15:10:15
515
原创 力扣面试150题--生命游戏和赎金信
题目要求原地完成更新,那么就存在问题,假如一个元素更新时,它周围的八个元素中存在从活到死或者从死到活的更新,就很导致该元素的更新错误,于是根据分析题目的四种更新策略,可以这么定于:活->死 用3来表示活->活 用1表示死->活 用4来表示死->死 用0来表示在判断某元素更新时,如果周围元素为1或者为3都说明这个元素是活的,如果周围元素不存在或者为0,4说明这个元素是死的。最后整体更新,将数组中的3变为1,4变为0即可。
2025-04-15 11:13:49
406
原创 力扣面试150题—旋转图像和矩阵置零
矩阵转置 在将列反转1 2 34 5 67 8 9转置1 4 72 5 83 6 9反转7 4 18 5 29 6 3。
2025-04-14 22:10:16
593
原创 力扣面试150题--螺旋矩阵
根据题目描述,我们需要顺时针输出矩阵元素,顺时针说明有四种输出状态,横向从左到右和从右到左,纵向从上到下和从下到上,唯一的难点在于,输出完成一层后,如何进入内层,我是这么做的: (这里的叙述比较繁琐,看代码清晰一点。
2025-04-13 13:45:56
319
原创 力扣面试150题--最小覆盖子串
假如第一轮取出的起始点为B,那么ADOBEC就会变成BEC,对于新的字符串而言,是不是我们向后再找到一个A就可以了。:每一轮取得的起始点,都是上一次已经遍历过的值,如果接着向后进行遍历,是一个重复的过程。下一轮遍历的起始点是:B 得到的字符串为BECODEBA。下一轮遍历的起始点是:C 得到的子串为:CODEBA。下一轮遍历的起始点是:A 得到的子串为ANC 结束。下一轮遍历的起始点是: B 得到的子串为:BANC。那存在什么问题导致了时间运行过长呢?第一次得到的子串是:ADOBEC。
2025-04-11 16:06:11
460
原创 力扣面试150题--三数之和 和 长度最小的子数组
这里就不介绍暴力做法了(因为我试了一上午都超时了)此题的难点有两个:1 时间复杂度 2 如何去重。
2025-04-09 13:31:07
320
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人