- 博客(96)
- 收藏
- 关注
原创 LeetCode 分类刷题:199. 二叉树的右视图
本文介绍了一种使用深度优先搜索(DFS)算法获取二叉树右视图的递归解法。关键思路是先递归右子树再递归左子树,当当前深度等于结果数组长度时,说明首次遇到该层最右节点,将其加入结果。时间复杂度为O(n),空间复杂度最坏为O(n)。算法巧妙利用递归顺序保证每层只记录最右侧节点,简洁高效地解决了问题。
2025-12-18 15:28:11
189
原创 LeetCode 分类刷题:110. 平衡二叉树
本文探讨如何判断二叉树是否为平衡二叉树。平衡二叉树的定义是左右子树高度差不超过1。本题递归解法:递归计算子树高度时,若发现不平衡(高度差大于1)则返回-1,否则返回实际高度。关键点在于正确声明局部变量(leftH/rightH),避免递归过程中变量污染。时间复杂度O(n),空间复杂度O(n)。代码实现中需注意变量声明问题(JavaScript中必须使用let/const),否则递归时会错误覆盖变量值。
2025-12-17 11:45:05
388
原创 LeetCode 分类刷题:101. 对称二叉树
本文介绍如何判断二叉树是否对称。通过递归比较左右子树是否互为镜像:左右子树当前节点值相等,且左子树的左孩子与右子树的右孩子、左子树的右孩子与右子树的左孩子都对称。时间复杂度O(n),空间复杂度O(n)。
2025-12-16 16:21:57
317
原创 LeetCode 分类刷题:100. 相同的树
本文探讨了如何判断两棵二叉树是否相同。通过递归方法,先比较根节点值,再递归比较左右子树。当遇到空节点时,若两树同时为空则返回true,否则返回false。算法时间复杂度为O(n),需要遍历所有节点;空间复杂度为O(n),由递归调用栈深度决定。该方法简洁高效地解决了二叉树相同性判断问题。
2025-12-15 14:45:34
251
原创 LeetCode 分类刷题:987. 二叉树的垂序遍历
该文介绍了二叉树垂序遍历的算法实现。采用深度优先搜索遍历二叉树,记录每个节点的行号、列号和值。使用哈希表按列号存储节点信息,最后按列号排序后,每列内先按行号再按值排序输出。时间复杂度O(nlogn)主要来自排序过程,空间复杂度O(n)用于存储节点信息。算法通过递归DFS遍历节点,利用哈希表分组存储,最终按要求顺序输出结果。
2025-12-10 17:09:40
376
原创 LeetCode 分类刷题:1448. 统计二叉树中好节点的数目
本文讨论了统计二叉树中好节点数量的两种递归解法。好节点定义为从根到该节点路径上所有节点值都不大于其自身值的节点。第一种解法通过外部变量记录结果,只有递过程;第二种解法(灵神和官方解法)采用完整递归,在递时维护路径最大值,在归时累加子树结果。时间复杂度均为O(n),空间复杂度最坏情况下为O(n)。第二种解法通过递归返回值传递信息,体现了先递后归的完整递归思想。
2025-11-24 12:32:19
610
原创 LeetCode 分类刷题:129. 求根节点到叶节点数字之和
本文介绍了一种计算二叉树所有根到叶路径数字之和的方法。采用深度优先搜索(DFS)遍历二叉树,每访问一个节点就将当前路径值乘以10加上节点值。当到达叶子节点时返回当前路径值,否则继续递归遍历左右子树。递归最终将所有叶子节点的路径值相加得到总和。算法时间复杂度为O(n),空间复杂度为O(n)(最坏情况下)。该方法通过递归实现了简洁高效的路径数字求和。
2025-11-23 17:56:29
270
原创 LeetCode 分类刷题:112. 路径总和
该算法使用深度优先搜索(DFS)判断二叉树是否存在根到叶子的路径和等于目标值。关键点:1)空节点返回false;2)到达叶子节点时若剩余和为0则返回true;3)递归检查左右子树。时间复杂度O(n),空间复杂度O(n)(最坏情况下)。注意空树必须返回false,因为路径必须从根到叶子节点。
2025-11-23 17:38:32
396
原创 LeetCode 分类刷题:404. 左叶子之和
本文讨论了计算二叉树所有左叶子节点之和的问题。解题思路分两种:1)递归遍历时通过标识位判断是否为左叶子;2)父节点视角判断左子节点是否为叶子。关键点在于左叶子的判断必须由父节点完成,因为叶子节点自身无法确定其左右位置。两种解法时间复杂度均为O(n),空间复杂度最坏情况下为O(n)。灵神的解法通过在递归后额外检查当前节点的左子节点是否为叶子,确保不漏计任何左叶子节点。
2025-11-20 10:53:03
669
原创 LeetCode 分类刷题:111. 二叉树的最小深度
本文讨论了如何计算二叉树的最小深度。与最大深度不同,最小深度需要考虑子节点为空的情况。当左右子节点都为空时返回1;当其中一边为空时返回另一边的最小深度;当两边都不为空时取较小深度加1。文章纠正了将最大深度解法简单修改的错误,并给出了正确的递归解法,时间复杂度为O(n)。关键点在于正确处理空子树情况,确保路径到达的是叶子节点。
2025-11-18 20:53:15
391
原创 LeetCode 分类刷题:104. 二叉树的最大深度
本文介绍了计算二叉树最大深度的两种递归方法。1. 自底向上解法:当节点为空时返回0,否则递归计算左右子树深度并取较大值加1,向上返回。2. 自顶向下解法:维护并更新全局最大深度,通过递归遍历时更新当前深度,向下传递。两者时间复杂度均为O(n),空间复杂度最坏为O(n),需注意JavaScript中必须显式声明局部变量(let/const/var),否则在严格模式下会报错。
2025-11-17 21:07:51
341
原创 LeetCode 分类刷题:1669. 合并两个链表
本文探讨了合并两个链表的算法问题。题目要求在链表1中删除a到b位置的节点,并将链表2接入该位置。给出了两种解法:个人解法使用快慢指针分别定位;官方解法更高效,通过先定位再移动指针,避免了额外变量。时间复杂度应为O(n+m),官方解法更规范地以输入规模上限表述复杂度,体现了更优的编程实践。两种方法空间复杂度均为O(1)。该问题展示了链表操作中指针移动和边界处理的技巧,以及算法复杂度分析中规范表述的重要性。
2025-11-16 20:30:11
443
1
原创 LeetCode 分类刷题:2487. 从链表中移除节点
该算法通过反转链表来移除右侧存在更大值的节点。首先反转原始链表,然后遍历链表,若当前节点值大于下一节点值则删除下一节点,否则继续遍历。最后再次反转链表恢复原始顺序。这种方法确保了只保留右侧没有更大值的节点,时间复杂度O(n),空间复杂度O(1)。关键步骤包括两次链表反转和一次遍历筛选。
2025-11-15 18:24:54
468
原创 LeetCode 分类刷题:3217. 从链表中移除在数组中存在的节点
本文介绍了一种从链表中删除指定数值节点的高效算法。首先将目标数值存入哈希集合实现O(1)查询,然后通过添加哨兵节点简化删除操作。算法遍历链表,遇到集合中的节点值即删除,时间复杂度为O(n+m),空间复杂度O(n)。该方案通过哈希预处理和哨兵节点的巧妙运用,优化了链表的删除操作效率。
2025-11-14 17:02:33
379
原创 LeetCode 分类刷题:203. 移除链表元素
本文介绍了一种根据指定数值对链表节点进行删除的方法,通过创建虚拟头节点(dummy)处理边界情况,使用循环遍历链表并删除所有值等于给定val的节点。算法时间复杂度为O(n),空间复杂度为O(1),适用于处理链表元素删除问题。
2025-11-14 16:46:40
240
原创 LeetCode 分类刷题:82. 删除排序链表中的重复元素 II
文章介绍了如何从已排序链表中删除所有重复节点,只保留不同数字。通过创建哨兵节点处理可能删除头节点的情况,使用双指针遍历链表,当发现重复节点时循环删除所有相同值的节点;否则继续向后遍历。时间复杂度O(n),空间复杂度O(1)。
2025-11-13 16:03:19
141
原创 LeetCode 分类刷题:83. 删除排序链表中的重复元素
给定一个已排序链表,要求删除所有重复元素使每个元素只出现一次。解法是遍历链表,当发现当前节点与下一节点值相同时,将当前节点的next指针指向下下个节点来删除重复节点。该算法时间复杂度O(n),空间复杂度O(1)。
2025-11-13 15:47:28
250
原创 LeetCode 分类刷题:19. 删除链表的倒数第 N 个结点
本文介绍了一种高效删除链表倒数第n个节点的方法。引入哨兵节点,通过使用快慢指针技巧,首先让快指针移动n步,然后快慢指针同步移动直到快指针到达末尾,此时慢指针指向要删除节点的前驱节点(倒数第n+1个节点)。关键点是引入哨兵节点简化边界情况处理(如删除头节点的情况)。该方法时间复杂度O(m),空间复杂度O(1),其中m为链表长度,是一种最优解决方案。
2025-11-13 15:31:07
410
原创 LeetCode 分类刷题:237. 删除链表中的节点
摘要:题目要求在无法访问链表头节点的情况下删除指定节点。解决方法是将当前节点的值替换为下一个节点的值,然后删除下一个节点,这样就能保持链表结构不变但删除了目标节点。时间复杂度O(1),空间复杂度O(1)。核心操作:node.val = node.next.val; node.next = node.next.next。
2025-11-13 15:14:00
254
原创 LeetCode 分类刷题:2130. 链表最大孪生和
本文解决链表孪生和最大值问题。定义孪生节点为对称位置节点,孪生和为两节点值之和。解法采用三步:1)快慢指针找到链表中点;2)反转后半段链表;3)同时遍历前后半段计算孪生和,维护最大值。算法时间复杂度O(n),空间复杂度O(1),高效且节省空间。
2025-11-12 11:44:16
340
原创 LeetCode 分类刷题:234. 回文链表
判断链表是否为回文有两种方法。第一种是用数组存储节点值,比较数组前后半段是否对称(时间复杂度O(n),空间复杂度O(n))。第二种更优解法:1)使用快慢指针找到中间节点;2)反转后半段链表;3)同时遍历原链表前半段和反转后的后半段进行值比较(时间复杂度O(n),空间复杂度O(1))。若需保持原链表不变,可在比较后将后半段再次反转恢复。两种方法都能有效判断回文链表,第二种方法在空间效率上更优。
2025-11-11 11:48:39
507
原创 LeetCode 分类刷题:143. 重排链表
摘要:本文介绍了如何重新排列单链表,使其变为首尾交替连接的形式。解题思路分为三步:1)使用快慢指针找到链表中点;2)反转后半部分链表;3)将前半部分和反转后的后半部分交替合并。提供了两种实现方案,均采用O(n)时间复杂度和O(1)空间复杂度。关键点在于熟练运用快慢指针找中点、链表反转以及双指针合并两个链表的技术。
2025-11-10 21:29:45
379
原创 LeetCode 分类刷题:142. 环形链表 II
摘要:本文介绍如何检测链表中环的入口节点。使用快慢指针,快指针每次走两步,慢指针每次走一步,两者相遇时说明存在环。然后让慢指针和头节点同时移动,相遇点即为环入口。该方法时间复杂度O(n),空间复杂度O(1)。关键点在于推导出慢指针与头节点移动a步后会在环入口相遇的数学关系。
2025-11-10 21:06:07
351
原创 LeetCode 分类刷题:141. 环形链表
本文介绍如何判断链表是否有环。使用快慢指针法,快指针每次移动两步,慢指针移动一步。如果存在环,快指针最终会追上慢指针(相遇);若无环,快指针会先到达链表末尾。时间复杂度O(n),空间复杂度O(1)。解题代码采用JavaScript实现,通过比较指针是否相等来判断环的存在。
2025-11-10 20:41:37
595
原创 LeetCode 分类刷题:876. 链表的中间结点
本文介绍了一种高效查找链表中间节点的方法。使用快慢双指针遍历链表,慢指针每次移动1步,快指针每次移动2步。当快指针到达链表末尾时,慢指针正好位于中间位置(奇数节点)或第二个中间节点(偶数节点)。该方法时间复杂度为O(n),空间复杂度为O(1),是最优解法。
2025-11-10 20:23:44
192
原创 LeetCode 分类刷题:2816. 翻倍以链表形式表示的数字
摘要:题目要求将代表非负整数的链表翻倍。作者解法通过反转链表、逐位计算并处理进位,最后再次反转得到结果,时间复杂度O(n),空间复杂度O(1)。灵神的优化方案更简洁:1)若头节点值大于4则先在前面补0;2)遍历时若下一节点大于4则提前+1进位。该方法同样保持O(n)时间和O(1)空间复杂度,但减少了操作次数。两种解法都高效完成了链表数字翻倍的任务,后者通过预判进位优化了计算过程。
2025-11-10 20:08:57
613
原创 LeetCode 分类刷题:445. 两数相加 II
该题解通过反转链表实现高位在前的两数相加。先将两个链表反转,从低位开始逐位相加并处理进位,最后再将结果链表反转恢复高位顺序。使用哨兵节点简化操作,时间复杂度O(n),空间复杂度O(1)。核心步骤包括:反转链表、按位相加处理进位、再次反转结果链表。
2025-10-31 17:52:06
415
原创 LeetCode 分类刷题:2. 两数相加
题目要求将两个逆序存储数字的链表相加,返回同样逆序的链表。解法思路是逐位相加并处理进位值。提供了两种解法:第一种分别处理两个链表的每一位和进位;第二种(灵神解法)使用哨兵节点,统一处理链表节点和进位。两种方法的时间复杂度都是O(n),空间复杂度O(1)。
2025-10-29 22:04:12
309
原创 LeetCode 分类刷题:24. 两两交换链表中的节点
本文介绍了两种解决链表节点两两交换问题的方法。解法1采用k个一组翻转链表(k=2)的思路,通过预处理计算链表长度,使用迭代法进行分组翻转。解法2采用更简洁的直接交换相邻节点法,通过维护前驱指针实现原地交换。两种方法均满足题目要求的O(n)时间复杂度和O(1)空间复杂度,适用于空链表或单节点链表等边界情况。关键点在于正确处理节点指针的重新链接,同时保持链表剩余部分的连接关系。
2025-10-29 16:41:59
162
原创 LeetCode 分类刷题:25. K 个一组翻转链表
该题目要求每k个节点一组翻转链表,不足k个的保持原序。解法首先统计链表长度n,然后进行n/k次翻转操作。每次翻转k个节点时保存原头节点,翻转后调整指针指向,将上一段的尾节点连接新翻转的头节点,原头节点(现尾节点)连接下一段头节点。时间复杂度O(n),空间复杂度O(1)。关键点在于正确处理节点间的指针关系,确保翻转后的链表正确连接。
2025-10-12 16:08:50
211
原创 LeetCode 分类刷题:92. 反转链表 II
该问题要求反转链表从位置left到right的节点。关键点在于正确处理链表节点的引用关系。通过创建虚拟头节点dummy,并使用双指针法进行局部反转:先定位到left前驱节点p0,然后反转left到right区间内的节点,最后重新连接反转后的子链表。解法时间复杂度O(right),空间复杂度O(1)。需注意Python中链式赋值与独立赋值的区别,前者使变量共享同一对象引用,后者创建独立对象。
2025-10-12 10:29:51
598
原创 LeetCode 分类刷题:206. 反转链表
本文介绍如何通过头插法反转单链表。算法使用三个指针(pre, cur, nxt)遍历原链表,将当前节点cur插入到新链表pre的头部,nxt记录下一个未反转的节点。最终cur指向空,返回pre即反转后的链表。该方法时间复杂度O(n),空间复杂度O(1)。
2025-10-10 11:39:30
275
原创 LeetCode 分类刷题:154. 寻找旋转排序数组中的最小值 II
题目要求在旋转后的有序数组(含重复元素)中寻找最小值。原数组升序排列,经1到n次旋转后,最小值可能位于任意位置。对于不含重复元素的情况,可通过二分法比较中间元素与右边界值来判断最小值位置。但当存在重复元素时(如x等于右边界值),无法直接判断其位于哪一段递增序列。此时需特殊处理:当x等于右边界时,逐步缩小右边界直至不相等,再应用二分法。该算法的时间复杂度为O(log n),最坏情况下退化为O(n)。
2025-10-09 10:38:59
871
原创 LeetCode 分类刷题:1901. 寻找峰值 II
该算法在m×n矩阵中寻找峰值元素。通过二分法在行维度上搜索,每次比较当前行最大值与下一行对应位置的值,从而确定峰值所在行范围。时间复杂度为O(nlogm),空间复杂度O(1)。算法初始将搜索范围设为[0,m-2],避免越界判断,最终返回找到的峰值行列索引。关键点在于利用行最大值与相邻行的比较来缩小搜索范围。
2025-10-07 17:17:05
461
原创 LeetCode 分类刷题:74. 搜索二维矩阵
本文探讨了在特殊有序矩阵中查找目标值的问题。该矩阵满足:每行递增且每行首元素大于前一行末元素。提出了两种解法:1)逐行二分查找,时间复杂度O(mlogn);2)将矩阵视为整体有序数组进行二分查找,时间复杂度O(log(mn))。后者通过数学映射将二维索引转换为一维坐标,显著提升了查找效率。两种方法均只需常数空间。
2025-10-05 11:32:33
442
原创 LeetCode 分类刷题:33. 搜索旋转排序数组
该问题要求在旋转后的有序数组中查找目标值,时间复杂度须为O(logn)。采用二分查找,通过判断中间元素与数组末尾元素的关系来确定目标值所在区间。若中间元素大于末尾元素,则处于第一递增序列;否则处于第二递增序列。再根据目标值与中间元素、末尾元素的大小关系调整搜索范围。最终返回目标值索引或-1。该方法有效利用了二分查找的特性,确保在旋转数组中快速定位目标值。
2025-09-29 15:56:43
440
原创 LeetCode 分类刷题:153. 寻找旋转排序数组中的最小值
给定一个经过多次旋转的升序数组,要求设计O(logn)算法找出最小元素。通过二分查找思想,比较中间元素与末尾元素的大小来缩小搜索范围:若中间元素大于末尾元素,则最小值在其右边;若中间元素小于等于末尾元素,否则最小值在该位置或其左边。最终返回右指针所指元素即为最小值。该算法时间复杂度为O(logn),空间复杂度O(1)。
2025-09-27 11:57:08
399
原创 LeetCode 分类刷题:162. 寻找峰值
该文章介绍了如何在O(logn)时间复杂度内找到数组中的峰值元素。峰值元素定义为严格大于相邻元素的数值。通过二分查找法,设置初始区间为(-1, n-1),根据中间元素与右侧元素比较确定峰值位置:若nums[mid]大于nums[mid+1],则峰值在mid或左侧,更新right;否则在右侧,更新left。最终返回right指针指向的峰值索引。这种方法确保了高效查找,满足题目要求的对数时间复杂度。
2025-09-26 22:30:06
422
原创 LeetCode 分类刷题:2517. 礼盒的最大甜蜜度
题目要求在给定糖果价格数组price和整数k的情况下,组合k类不同糖果形成礼盒,使任意两种糖果价格绝对差的最小值(甜蜜度)最大化。通过排序数组后采用二分查找法,对可能的甜蜜度进行验证,使用贪心策略,通过定义check函数统计满足条件的糖果数量,验证当前甜蜜度能否选出足够种类的糖果,根据结果调整二分。最终返回满足条件的最大甜蜜度。
2025-09-21 16:19:38
389
原创 LeetCode 分类刷题:2439. 最小化数组中的最大值
本文探讨如何通过操作数组使最大值最小化。给定一个非负整数数组,每次操作可将某个元素减1并将其前一个元素加1。通过二分查找确定可能的最小最大值:下界为数组最小值减1,上界为数组最大值。算法从后往前遍历数组,检查当前元素与额外值之和是否超过限制。时间复杂度为O(nlogU),空间复杂度O(1),其中n为数组长度,U为数组最大值。
2025-09-19 16:18:40
359
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅