自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 LeetCode hot100——K 个一组翻转链表

本文解析了LeetCode第25题"K个一组翻转链表"的解题思路。通过军训排队的类比,形象说明了分组翻转的关键在于正确处理组间连接。算法分为三个模块:寻找区间、局部翻转和主循环缝合,重点在于使用虚拟头节点和巧妙设计的翻转函数。时间复杂度O(n),空间复杂度O(1)。文章还对比了该题与"两两交换"问题的联系,指出前者是后者的泛化情况。核心技巧在于翻转时让prev初始指向下一组开头,从而简化连接操作。

2026-04-11 15:20:01 224

原创 LeetCode hot100——两两交换链表中的节点

本文介绍了链表节点两两交换的算法实现。通过交谊舞换位的类比,形象说明了交换过程:使用虚拟头节点作为"领队",采用三步迭代法(记录下一节点、交换当前节点指向、更新前驱节点)确保链表不断裂。算法时间复杂度O(n),空间复杂度O(1)。关键点在于必须使用虚拟头节点统一处理逻辑,并严格按顺序操作避免断链。文末提供了完整的TypeScript实现代码和ACM模式测试方法,强调了交换顺序的重要性。

2026-04-11 01:17:59 198

原创 LeetCode hot100——删除链表的倒数第 N 个结点

本文介绍了使用双指针技巧高效删除链表倒数第N个节点的方法。通过类比拉绳子的生活场景,解释了快慢指针的工作原理:快指针先走N步建立间距,然后两指针同步移动,当快指针到达末尾时,慢指针正好指向目标节点。文章提供了TypeScript实现代码,包含建立间距、同步移动、删除处理三个关键步骤,并分析了O(L)时间复杂度和O(1)空间复杂度。特别说明了删除头节点的特殊情况处理,最后给出了ACM模式的验证方法。这种方法只需一次遍历即可完成任务,比传统两次遍历更高效。

2026-04-10 08:16:23 214

原创 LeetCode hot100——两数相加

本文介绍了如何通过链表实现大数相加。针对力扣"两数相加"问题,文章提出使用模拟竖式加法的解法:1. 采用虚拟头节点简化链表构建;2. 同步遍历两个链表,处理不等长情况时自动补零;3. 动态维护进位变量,确保正确处理最高位进位。该方法时间复杂度O(max(m,n)),空间复杂度O(1),完美解决传统数字转换方法的大数精度问题。文章还提供了TypeScript实现代码和ACM模式测试方法,并强调必须将进位检查纳入循环条件,以防止类似99+1=100这样的边界情况出错。

2026-04-09 21:00:00 206

原创 LeetCode hot100——合并两个有序列表

本文介绍了合并两个有序链表的算法思路与实现。通过排队登机的类比,形象解释了如何通过比较两个链表当前节点值来有序合并。核心技巧是使用虚拟头节点简化操作,避免了处理初始节点的复杂性。算法采用双指针遍历两个链表,每次选择较小值的节点连接,时间复杂度O(n+m),空间复杂度O(1)。文章还提供了完整的代码实现,包括处理剩余节点的巧妙方法,并解释了虚拟头节点的优势在于统一处理所有节点,使代码更简洁。最后通过示例演示了完整的合并过程。

2026-04-09 15:46:38 200

原创 LeetCode hot100——环形链表

本文介绍了判断链表是否存在环以及寻找环入口的算法。通过快慢指针法(双指针法),可以高效解决环形链表问题:1. 判断是否有环:快指针每次走两步,慢指针走一步,若相遇则存在环,时间复杂度O(n),空间复杂度O(1)。2. 寻找环入口:在快慢指针相遇后,将快指针重置到链表头,与慢指针同速前进,再次相遇点即为环入口。文章包含生活化类比、核心思路、代码实现、复杂度分析和ACM模式写法,并解答了关于步长选择和边界条件的常见疑问。该算法在时间和空间复杂度上都达到最优,是解决环形链表问题的经典方法。

2026-04-08 21:00:00 345

原创 LeetCode hot100——回文链表

本文介绍了一种在O(1)空间复杂度下判断链表是否为回文结构的方法。核心思路是:1)使用快慢指针找到链表中点;2)反转后半部分链表;3)使用双指针比较前半段和反转后的后半段是否一致。该方法通过原地修改链表结构,避免了额外空间消耗。时间复杂度为O(n),空间复杂度为O(1)。文章还提供了完整的代码实现,包括链表构建、反转和回文判断函数,并解释了关键步骤如快慢指针终止条件的设定和节点比较的方式。

2026-04-08 10:42:42 221

原创 LeetCode hot100——反转链表

本文讲解了反转链表的经典解法,通过"老鹰捉小鸡"的生活化类比,说明如何通过改变指针指向实现链表反转。核心思路是使用三个指针(pre、cur、next)进行迭代操作:记录下一个节点、反转当前指针、移动指针位置。文章提供了TypeScript代码实现,分析了O(n)时间复杂度和O(1)空间复杂度的优势,并给出了ACM模式下的完整处理流程,包括链表构建和结果输出。重点强调了操作顺序的重要性,必须先保存下一个节点再反转指针,避免断链问题。

2026-04-07 22:08:29 169

原创 LeetCode hot100——相交链表

摘要:LeetCode 160题“相交链表”要求找到两个链表的交点。核心思路采用双指针法:指针pa和pb分别遍历链表A和B,到达末尾时切换到另一链表头部继续遍历。若两链表相交,pa和pb会在交点相遇;若不相交,最终同时指向null。时间复杂度O(m+n),空间复杂度O(1)。该方法通过“路径互换”对齐遍历长度,比传统“长度差”解法更简洁高效。代码实现中,边界处理与循环逻辑清晰,确保正确性。示例通过构建相交链表验证算法,并解析了不相交时双指针同时为null的终止条件。

2026-04-07 18:53:16 236

原创 LeetCode hot100——缺失的第一个正数

这篇文章探讨了如何在数组中找到缺失的最小正整数,重点介绍了两种方法:哈希集合法和原地哈希法。哈希集合法通过额外空间存储数组元素,简单直观但空间复杂度为O(n);而原地哈希法则巧妙利用原数组作为哈希表,通过元素交换将数字归位到对应下标,实现了O(1)空间复杂度。文章通过[3,4,-1,1]的实例演示了原地哈希法的操作流程,强调了使用while循环确保彻底归位的重要性,并提供了完整的TypeScript实现代码。最终方案满足了面试中的苛刻要求,既高效又节省空间,是解决此类问题的经典范例。

2026-04-06 17:09:08 364

原创 LeetCode hot100——除了自身以外数组的乘积

摘要:本文介绍了LeetCode 238题"除自身以外数组乘积"的解题思路。通过类比合影时计算每个人左右两侧身高乘积的生活场景,提出"两次遍历"的优化解法:第一次从左到右计算每个元素左侧乘积,第二次从右到左计算右侧乘积并叠加。该方法时间复杂度O(n),空间复杂度O(1),避免了除法运算带来的除零问题。文中给出了TypeScript实现代码,并解释了倒序遍历的原因是为了高效累积右侧乘积。最后还提供了ACM模式下的Node.js处理方案。

2026-04-03 22:00:00 177

原创 LeetCode hot100——轮转数组

摘要:本文探讨数组轮转问题(LeetCode 189),通过生活化类比(旋转火锅餐桌)解释轮转逻辑,强调有效转动次数为$k \mod n$。核心解法分三步:1)取模计算实际轮转次数;2)用splice(-k)截取末尾元素;3)通过unshift将元素插入数组头部。代码实现简洁,但需注意splice和unshift的时间复杂度为$O(n)$,空间复杂度因临时数组存在也为$O(n)$。文末解答了关于负数索引和原地修改的疑问,指出该方法虽通过LeetCode判定,但严格算法竞赛可能要求更低空间复杂度。

2026-04-03 16:42:37 220

原创 LeetCode hot100——合并区间

这在排班系统、日历冲突检测等实际开发中经常遇到。

2026-04-01 21:30:00 365

原创 LeetCode hot100—— 最大子数组和

当你捡了一堆金币,突然踩到一个小陷阱(比如 -2),如果你手里的金币还剩很多,你会觉得:“没关系,抵消掉这 2 个,我手里还有盈余,继续往前走可能还有大金币。翻译:当前数字会想,“我是自己过(重新开始)比较爽,还是带着前任(之前的累加和)一起过比较爽?(比如 -5),这时候你面前出现了一个哪怕只有 1 块钱的新金币,你会怎么做?只用了两个变量,没有开辟额外的数组空间,空间利用率拉满。如果是“负能量”,我就踢开他。,从这个 1 块钱重新开始你的“暴富之路”。的路程,让你捡到的金币总数最大。

2026-04-01 15:36:44 248

原创 LeetCode hot100——和为 K 的子数组

摘要:本文介绍了解决"和为K的子数组"问题的优化方法。由于数组中可能存在负数,传统滑动窗口方法失效。核心思路是采用前缀和与哈希表结合的方式:1) 计算前缀和数组;2) 将问题转化为查找presum[j-1] = presum[i]-k;3) 使用哈希表记录前缀和出现次数。该方法将时间复杂度优化至O(n)。文章通过超市记账的生动例子解释算法原理,并提供了TypeScript实现代码和ACM模式下的Node.js读取输入方法。

2026-03-31 12:10:00 352

原创 LeetCode hot100——找到字符串中所有字母异位词

本文介绍了使用滑动窗口算法解决LeetCode 438题"找到字符串中所有字母异位词"的方法。通过将目标字符串p视为"标准指纹",在字符串s上滑动固定大小的窗口进行比对。每次窗口移动时只需更新频次表中"一进一出"的字符,通过比较频次表判断是否找到异位词。时间复杂度为O(n),空间复杂度为O(1)。文章提供了JavaScript实现代码,并说明了如何在ACM模式下处理输入输出。该方法高效地解决了字母异位词的查找问题。

2026-03-30 16:01:04 220

原创 LeetCode hot100——无重复字符的最长子串

本文介绍了使用滑动窗口算法解决"无重复字符的最长子串"问题的两种实现方法。第一种数组法通过物理切割处理重复字符,但存在性能问题;第二种Map优化法通过记录字符位置和移动指针来提高效率。文章详细演示了两种方法的执行过程,并提供了对应的JavaScript代码实现,最后还介绍了ACM模式下的输入处理方式。两种方法的核心都是维护一个不含重复字符的窗口,通过移动左右边界来寻找最大子串长度。

2026-03-30 12:14:37 390

原创 LeetCode hot100——接雨水

本文介绍了LeetCode第42题"接雨水"的双指针解法。核心思路是利用"木桶效应":每格蓄水量由左右两侧最高墙的较小值决定。通过左右指针向中间移动,比较当前高度,处理矮的一侧并计算蓄水量。文章通过示例[4,2,0,3,2,5]详细演示了计算过程,最终得出总蓄水量为9。解题关键在于"放弃局部,把握全局",只需确定当前短板侧即可计算水位。文末提供了TypeScript代码实现和Node.js的ACM输入处理方式。

2026-03-29 22:05:16 361

原创 LeetCode hot100——三数之和

本文介绍了LeetCode第15题"三数之和"的解题思路。该题的关键在于找到不重复的三元组组合。核心解法采用"排序+双指针"策略:先对数组排序,固定一个数后转化为两数之和问题,使用左右指针寻找符合条件的组合。重点讲解了去重处理,包括跳过重复的固定数和指针移动时的重复值判断。相比哈希表解法,这种方案更高效简洁。文章最后还提供了TypeScript实现代码和ACM模式的Node.js输入处理示例。时间复杂度为O(n²),空间复杂度为O(1)。

2026-03-28 10:00:00 366

原创 LeetCode hot100——盛最多水的容器

学习了“ 双指针” 的基础知识后,我们继续来完成第二道题。

2026-03-27 20:51:56 244

原创 LeetCode hot100——移动零

摘要:本文介绍了双指针算法的核心概念和应用场景。双指针分为同向而行的快慢指针(用于移动零、环形链表检测等)和双向奔赴的对撞指针(用于二分查找、两数之和等)。重点以"移动零"问题为例,详细讲解了快慢指针的工作机制:快指针寻找非零元素,慢指针标记填充位置,最后补充剩余位置的零。文章还提供了TypeScript实现代码和ACM模式下的Node.js解决方案,展示了如何通过双指针在O(n)时间复杂度和O(1)空间复杂度内优雅解决问题。

2026-03-26 21:04:33 386

原创 LeetCode hot100——最长连续序列

接下来完成 LeetCode hot100 哈希部分的第三题。

2026-03-25 10:00:00 368

原创 LeetCode hot100——字母异位词分组

摘要:本文介绍了LeetCode第49题"字母异位词分组"的两种解法。重点讲解了字符计数法:为每个字符串创建26位数组记录字母出现次数,转换为"1#0#..."格式的指纹字符串作为哈希表键值,将相同字母组成的单词归为一组。时间复杂度优化为O(NK),优于排序法的O(NKlogK)。同时说明了ACM模式下处理输入输出时的JSON解析和格式化技巧,以及Array.from()和扩展运算符的等价用法。

2026-03-24 18:51:50 411

原创 LeetCode hot100——两数之和

在正式开始之前,先来介绍一下什么是核心代码模式,什么是ACM 模式?像我们在常见的刷代码平台,比如 leetcode ,采用的是核心代码模式。在这种情况下,我们只需要掌握算法的核心思想,也就是只需要写出核心逻辑(Solution类),输入输出都已经帮你打理好了。但在 ACM 模式下,你就像一个接线员,你需要自己去接听电话(读取输入)、处理业务(运行算法)、然后挂断电话并给出回复(打印输出)。下面以两数之和 举例两数之和暴力解法let sum;i++){j++){

2026-03-23 20:31:32 608

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除