力扣hot100
文章平均质量分 78
讲解自己学习的基础算法
程序员里程碑
记录编程学习之路
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
二叉树---翻转二叉树
本文介绍了翻转二叉树的递归解法。核心思路是交换每个节点的左右子树,递归处理步骤如下:1)终止条件为节点为空;2)交换当前节点的左右孩子;3)递归处理左右子树。C++代码简洁明了,时间复杂度O(n),空间复杂度O(h)。文章还对比了递归和迭代(BFS)两种实现方式,强调掌握递归三要素(功能定义、终止条件、递推公式)是解决二叉树问题的关键。该解法直观展示了分治思想在树结构中的应用,是面试常见题型。原创 2026-04-16 21:16:53 · 397 阅读 · 0 评论 -
二叉树---二叉树的最大深度
本文介绍了三种计算二叉树最大深度的解法:1. 递归DFS(后序遍历+分治思想):代码简洁,时间复杂度O(n),空间复杂度O(h);2. 迭代BFS(层序遍历):按层计数,无递归风险,时空复杂度均为O(n);3. 迭代DFS(栈模拟递归):避免递归栈溢出,适合大数据量。三种方法各具特点:递归DFS最简洁,BFS直观理解层级,迭代DFS适合工程应用。建议刷题优先使用递归,面试时展示多种解法,根据实际场景选择最优方案。核心公式"当前深度=子树最大深度+1"是解决二叉树深度问题的通用思路。原创 2026-04-15 21:30:27 · 415 阅读 · 0 评论 -
二叉树---二叉树的中序遍历
这篇文章介绍了二叉树中序遍历的迭代实现方法,核心是使用栈来模拟递归过程。文章首先给出完整的C++代码实现,然后详细解析了4个关键步骤:1)一路向左将节点入栈;2)到达最左端后弹出栈顶;3)访问当前节点(中序位置);4)转向右子树。通过一个简单示例(1-2-3树)演示了执行流程,最终输出[1,3,2]。该方法时间复杂度O(n),空间复杂度O(n),避免了递归的栈溢出风险,适用于前序、后序遍历的模板修改,是面试中的标准解法。原创 2026-04-11 20:49:52 · 341 阅读 · 0 评论 -
链表--LRU缓存
本文详细解析了LRU缓存的设计与实现,通过双向链表维护数据使用时序,哈希表实现快速查找,确保get和put操作均为O(1)时间复杂度。重点阐述了数据结构选型依据、C++代码实现(可直接用于面试)、核心API逻辑及关键细节,包括splice函数的妙用、迭代器失效预防等常见易错点。文章不仅提供了完整的解决方案,还深入分析了LRU缓存的底层原理和面试考点,帮助开发者全面掌握这一高频面试题。原创 2026-03-24 21:27:46 · 517 阅读 · 0 评论 -
链表---合并k个链表
本文介绍合并K个有序链表的算法实现。通过使用最小堆(优先队列)优化合并过程,每次从所有链表头节点中取出最小值,将时间复杂度从O(NK)降低到O(NlogK)。算法步骤:1)将所有非空链表头节点入堆;2)循环取出堆顶最小节点接到结果链表;3)若该节点有后继节点则将其入堆。C++实现采用优先队列和lambda比较器,使用哑节点简化链表操作。该方法适用于外部排序等多路归并场景,是面试常见考点,相比暴力两两合并法效率更高,空间复杂度为O(K)。原创 2026-03-23 09:34:51 · 343 阅读 · 0 评论 -
链表--随机链表的复制
本文介绍了LeetCode 138题"复制带随机指针的链表"的哈希表解法。该题难点在于处理随机指针的深拷贝关系,通过使用哈希表建立原节点与新节点的映射,分两步完成拷贝:首先遍历原链表创建新节点并存储映射关系,然后再次遍历为随机指针赋值。文章详细解析了C++实现代码,包括边界处理、尾插法创建链表等关键细节,并分析了时间空间复杂度。该方法时间复杂度O(n),空间复杂度O(n),是解决此类问题的经典思路。原创 2026-03-20 18:06:57 · 400 阅读 · 0 评论 -
链表-----
摘要: 本文解析LeetCode 25题(K个一组翻转链表)的解题思路与常见陷阱。通过分析一段错误代码,指出两个关键问题:1)C++中ListNode拷贝构造导致的编译错误,需改用直接构造;2)未重置pre指针引发的链表成环或顺序混乱。最终给出迭代解法,利用哨兵节点简化操作,分组完成局部翻转后重新连接,确保时间复杂度O(N)、空间复杂度O(1)。核心技巧包括指针状态管理、分组处理模板及哨兵节点应用,强调编程时需注意语言特性与指针逻辑的严密性。原创 2026-03-18 18:47:27 · 605 阅读 · 0 评论 -
链表-----两两交换链表中的节点
本文介绍了如何在不修改节点值的情况下两两交换链表中的相邻节点。通过引入虚拟头结点(dummy)和三个指针(node0、node1、node2)的滑动操作,实现了高效交换。关键点包括:使用dummy节点统一处理头节点变化,三步重连操作完成节点交换,以及正确推进指针到下一组。算法时间复杂度O(n),空间复杂度O(1),适用于各种长度的链表,包括空链表和单节点链表。文中提供了C++实现代码和详细的图解示例,特别强调了循环条件和指针移动顺序等注意事项。原创 2026-03-17 12:33:03 · 7821 阅读 · 0 评论 -
链表---- 删除链表的倒数第 N 个结点
🔥个人主页:Milestone-里程碑❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>> <<Git>><<MySQL>>🌟心向往之行必能至给定一个链表,删除链表中倒数第 n 个节点,并返回链表的头节点。cpp运行逐行代码超详细解析1. 哨兵节点(关键!)cpp运行 作用:统一处理所有删除场景,包括删除第一个节点 没有哨兵节点时,删除头节点需要单独写判断逻辑,代码冗余2. 指针初始化cpp运行左右指针从同一个起点(哨兵节点)出原创 2026-03-16 10:09:59 · 724 阅读 · 0 评论 -
链表----两数相加
🔥个人主页:Milestone-里程碑❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>> <<Git>><<MySQL>>🌟心向往之行必能至给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。输入:, 输出:解释:342 + 465 = 807,逆序存储即为 7 -> 0 -> 8。输入:原创 2026-03-15 09:08:33 · 533 阅读 · 0 评论 -
链表---有序链表
摘要 本文介绍了合并两个升序单链表的经典算法。通过使用双指针遍历和哨兵节点技术,实现了时间复杂度O(n+m)、空间复杂度O(1)的最优解。核心思路包括:1)创建哨兵节点简化头节点处理;2)同时遍历比较两个链表节点值;3)将较小值节点接入结果链表;4)直接拼接剩余节点。文章提供了完整的C++代码实现,并详细解析了每个步骤的作用,特别强调了哨兵节点对边界条件的处理优势。该解法逻辑清晰,无冗余代码,是面试中链表基础操作的标准答案。掌握此方法可以有效提升链表问题的解决能力。原创 2026-03-14 19:14:19 · 519 阅读 · 0 评论 -
链表----环形链表
本文介绍了判断链表是否存在环的经典解法——快慢指针法(Floyd判圈算法)。通过定义慢指针(每次1步)和快指针(每次2步),若链表有环则两指针必会相遇,否则快指针会到达链表末尾。文章详细解析了算法原理、代码实现(包括边界处理和复杂度分析),并对比了哈希表解法(空间复杂度较高)。快慢指针法以O(n)时间复杂度和O(1)空间复杂度成为最优解决方案,是处理环形链表问题的经典模板。原创 2026-03-12 22:04:45 · 232 阅读 · 0 评论 -
链表----回文链表
本文介绍了判断单链表是否为回文结构的O(1)空间解法。核心思路是:1)使用快慢指针定位链表中点;2)反转后半段链表;3)前后两段逐个比较;4)可选恢复原链表结构。该方法通过快慢指针和就地反转技术,在O(n)时间复杂度和O(1)空间复杂度内解决问题。C++实现展示了完整的四步流程,包括链表反转和恢复操作。文章还探讨了优化思路和递归方案的局限性,强调该方法在空间效率上的优势,适合处理大规模链表数据。原创 2026-03-11 17:53:29 · 371 阅读 · 0 评论 -
链表---回文链表
本文介绍了LeetCode第234题「回文链表」的高效解法。通过快慢指针找到链表中点后,反转后半段链表,再使用双指针逐位比较前后两半的值是否相同。该方法时间复杂度O(n),空间复杂度O(1),完美满足题目要求。文章详细解析了算法思路、C++代码实现及复杂度分析,并提供了可选的原链表恢复步骤。该方案巧妙结合指针操作,避免了使用额外空间,是处理大规模链表回文判断的理想选择。原创 2026-03-10 11:31:38 · 510 阅读 · 0 评论 -
链表---反转链表
双指针法是面试中更推荐的解法,因为它空间复杂度更低,且避免了递归的栈溢出问题。递归法代码简洁,适合理解链表的分治思想。原创 2026-03-09 23:30:26 · 594 阅读 · 0 评论 -
链表---反转链表
双指针法:逻辑清晰,空间复杂度低,是面试首选。递归法:代码更短,但要注意栈溢出风险(链表过长时)。拓展:反转链表的变种题,如 “反转链表 II”(反转指定区间),都可以基于这两种思路扩展。原创 2026-03-08 21:28:01 · 221 阅读 · 1 评论 -
链表---相交链表
Milestone的个人主页展示其技术学习轨迹,包含力扣hot100算法题解、C++/Linux编程、Git版本控制和MySQL数据库等专栏内容。"心向往之行必能至"的座右铭体现其坚定的学习信念。该简介突出作者在计算机多个领域的学习积累,150字内完整呈现其技术栈和积极进取的学习态度。原创 2026-03-06 22:06:24 · 243 阅读 · 5 评论 -
矩阵---搜索二维矩阵 II
本文介绍了一种在行列有序矩阵中高效查找目标值的算法。该矩阵每行从左到右、每列从上到下均为升序排列。算法从矩阵右上角开始搜索:若当前值等于目标值则返回true;若小于目标值则下移排除当前行;若大于目标值则左移排除当前列。时间复杂度为O(m+n),空间复杂度O(1)。C++实现通过双指针逐步缩小搜索范围,直至找到目标或遍历完所有可能路径。这种方法巧妙利用了矩阵的双向有序特性,提供了比逐行二分更高效的解决方案。原创 2026-03-05 23:25:42 · 311 阅读 · 1 评论 -
矩阵--旋转图像
本文介绍了一种原地旋转n×n矩阵90度的方法。通过两步操作实现:首先对矩阵进行转置(交换matrix[i][j]和matrix[j][i]),然后反转每一行的元素顺序。该方法时间复杂度为O(n²),空间复杂度为O(1),满足题目要求。这种"转置+行反转"的思路简洁高效,可推广应用于其他矩阵变换问题。原创 2026-03-04 23:01:25 · 266 阅读 · 0 评论 -
矩阵-----螺旋矩阵
本文介绍了顺时针螺旋遍历矩阵的边界收缩法。通过维护四个边界变量(l,r,u,d),依次进行四个方向的遍历:从左到右→从上到下→从右到左→从下到上,每完成一轮遍历就收缩对应边界。当边界交叉时终止循环,确保所有元素被访问一次。该方法时间复杂度O(mn),空间复杂度O(1),是解决该问题的首选高效方案。原创 2026-03-03 21:49:18 · 231 阅读 · 3 评论 -
矩阵-----矩阵置零
矩阵置零算法摘要 该算法用于将矩阵中0元素所在的行列全部置零,要求使用原地算法(O(1)空间复杂度)。 核心思路: 利用矩阵首行首列作为标记位: 首行标记需要置零的列 首列标记需要置零的行 使用两个布尔变量单独记录首行首列本身是否需要置零 算法步骤: 预处理标记首行首列状态 遍历矩阵内部元素,用首行首列记录0元素位置 根据标记批量置零内部行列 最后处理首行首列置零 复杂度: 时间复杂度:O(m×n) 空间复杂度:O(1) 关键点:通过复用矩阵自身空间存储标记,避免额外空间使用,实现原地修改。原创 2026-03-02 23:02:49 · 1117 阅读 · 4 评论 -
普通数组-----缺失的第一个正数
cpp运行定义数组长度n,简化后续代码,同时明确有效正整数的范围是[1, n](超过n的正整数不可能是答案)。这道题的核心是原地哈希思想,通过利用数组自身存储映射关系,突破了常数空间的限制,是 LeetCode 高频考察的思维题。掌握这个思路后,同类的「原地修改数组找缺失值」题目都可以用相同逻辑解决~原创 2026-03-01 21:23:37 · 604 阅读 · 0 评论 -
普通数组---除自身以外数组的乘积
本文解析了LeetCode 238题"除自身以外数组的乘积"的解题思路。题目要求在O(n)时间且不使用除法的情况下,计算数组中每个元素除自身外的乘积。核心解法采用前缀积和后缀积的双数组方法:先从左到右计算每个元素左侧的乘积(前缀积),再从右到左计算右侧乘积(后缀积),最后将两者相乘得到结果。该方法通过三次线性遍历完成,时间复杂度O(n),空间复杂度O(n)。文章还提供了C++代码实现和测试验证,并建议进阶思考如何优化空间复杂度至O(1)。这道题体现了分治思想和数组问题的经典解法,对处理类原创 2026-02-26 20:02:01 · 437 阅读 · 4 评论 -
普通数组---合并区间
本文介绍了使用贪心算法解决区间合并问题的思路。首先将区间按左端点排序,然后遍历区间数组:若当前区间与结果数组中最后一个区间重叠或相邻,则合并右端点;否则直接加入结果数组。关键点包括排序的必要性、使用max更新右端点以避免遗漏,以及emplace_back的效率优势。算法时间复杂度为O(nlogn),空间复杂度为O(n)。该问题展示了贪心算法在区间类问题中的典型应用模式:排序定序、遍历判重、贪心合并。原创 2026-02-23 20:46:48 · 908 阅读 · 1 评论 -
矩阵----=矩阵置零
摘要: 本文提出了一种原地算法(O(1)空间复杂度)解决矩阵置零问题。核心思路是利用矩阵首行和首列存储标记信息: 检查首行首列是否含0,记录标记; 遍历矩阵,用首行首列标记需置零的行列; 根据标记将对应元素置零; 最后处理首行首列。算法时间复杂度为O(mn),仅需两个额外变量。示例演示了从初始矩阵到最终结果的完整处理流程,验证了算法的正确性。原创 2026-02-11 20:57:24 · 413 阅读 · 10 评论 -
普通数组-----缺失的第一个正数
摘要:本文提出一种O(n)时间复杂度、O(1)空间复杂度的算法,用于寻找未排序数组中缺失的最小正整数。核心思路是通过原地置换将数值k放到索引k-1的位置,最终扫描数组找到第一个不匹配的位置即为答案。算法分两步:首先进行元素置换,使1-n范围内的数归位;然后线性扫描找出缺失值。示例演示了算法过程,证明该方法高效且满足严格的复杂度要求。原创 2026-02-10 23:00:10 · 514 阅读 · 2 评论 -
普通数组-----除了自身以外数组的乘积
本文介绍了一种高效计算数组中除自身外所有元素乘积的算法。题目要求在O(n)时间复杂度和不使用除法的情况下解决问题。算法采用前缀乘积和后缀乘积的思路:先正向遍历计算每个元素的前缀乘积,再反向遍历计算后缀乘积,最后将两者相乘得到结果。初始实现使用两个辅助数组,空间复杂度为O(n)。优化版本直接在结果数组上计算前缀乘积,并用变量动态维护后缀乘积,将空间复杂度降至O(1)。两种方法都满足时间复杂度要求,后者更节省空间。原创 2026-02-08 22:49:01 · 362 阅读 · 3 评论 -
普通数组----轮转数组
本文介绍了三种解决数组轮转问题的方法:1. 额外数组法(O(n)空间)直接存储轮转结果;2. 三次反转法(最优解,O(1)空间)通过整体和局部反转实现原地操作;3. 环状替换法(O(1)空间)以环状方式交换元素位置。三种方法时间复杂度均为O(n),但空间复杂度不同,其中三次反转法在时间和空间上均为最优,推荐作为首选解法。原创 2026-02-07 23:02:23 · 515 阅读 · 6 评论 -
普通数组----合并区间
摘要 本文介绍了一种合并重叠区间的高效算法。首先对区间数组按左端点排序,然后遍历处理:若当前区间与结果数组中最后一个区间无重叠则直接加入,否则合并右端点。算法时间复杂度为O(nlogn)(主要来自排序),空间复杂度为O(n)。关键点在于正确判断重叠条件和合理更新右边界。示例展示了如何将[[1,3],[2,6]]合并为[1,6]等典型情况。原创 2026-02-06 22:59:59 · 488 阅读 · 4 评论 -
普通数组----最大子数组和
本文介绍了LeetCode 53题"最大子数组和"的高效解法。通过前缀和与最小前缀和的概念,将问题转化为寻找最大差值。核心思路是维护当前前缀和、最小前缀和和全局最大值三个变量,在一次遍历中完成计算。该方法时间复杂度O(n),空间复杂度O(1),与Kadane算法效率相当但思路更数学化。文中提供了C++实现代码、示例验证和复杂度分析,并对比了不同解法特点,适用于面试准备和算法学习。原创 2026-02-05 22:58:49 · 866 阅读 · 16 评论 -
滑动窗口----最小子串
本文介绍了使用滑动窗口和哈希计数解决字符串最小覆盖子串问题的方法。通过维护一个动态窗口和字符需求哈希表,算法能够高效地找到包含目标字符串所有字符的最短子串。文章详细解析了代码实现步骤,包括初始化字符计数、扩展窗口、收缩窗口以及结果返回等关键环节,并分析了算法的时间复杂度为O(m+n),空间复杂度为O(1)的优异性能。该解法巧妙结合了滑动窗口的高效性和哈希表的精确计数特点,是处理字符串子串匹配问题的经典范例。原创 2026-02-04 23:04:51 · 370 阅读 · 2 评论 -
滑动窗口------滑动窗口最大值
本文介绍了一种使用单调队列高效解决滑动窗口最大值问题的方法。通过维护一个存储数组下标的双端队列,保证队列中的元素对应值单调递减,使得队首始终是当前窗口最大值。算法包含三个关键步骤:维护队列单调性、移除窗口外元素和记录窗口最大值。相比暴力解法的O(nk)时间复杂度,该算法将复杂度优化至O(n),空间复杂度为O(k)。代码实现简洁高效,适用于大规模数据处理。原创 2026-02-03 23:02:40 · 318 阅读 · 3 评论 -
子串-----和为 K 的子数组
本文介绍了一种高效解决"和为k的子数组个数"问题的方法。通过前缀和与哈希表结合,将时间复杂度从暴力解法的O(n²)优化到O(n)。具体实现:1) 计算前缀和;2) 用哈希表记录各前缀和出现次数;3) 查询满足preSum[i]-k的前缀和数量。关键技巧是初始化hash[0]=1以处理从数组起始开始的子数组情况。该方法有效处理了包含负数的情况,适用于大规模数据。原创 2026-02-02 22:59:52 · 374 阅读 · 1 评论 -
滑动窗口-----找到所有字母异位词
本文介绍了一种使用滑动窗口算法在字符串s中查找所有p的字母异位词子串的方法。通过维护一个26位的字符计数数组,先统计p的字符频率,然后在遍历s时动态调整窗口边界:右指针移动时减少字符计数,当计数为负时移动左指针收缩窗口。当窗口长度等于p的长度时,记录有效起始索引。该算法时间复杂度为O(n+m),空间复杂度O(1),是解决异位词子串匹配问题的高效方案。原创 2026-02-01 23:01:42 · 920 阅读 · 2 评论 -
滑动窗口----滑动窗口最大值
本文介绍了使用单调队列解决滑动窗口最大值问题的高效算法。通过维护一个双端队列来存储单调递减的元素下标,确保队首始终是当前窗口最大值。算法步骤如下:1)新元素入队时移除队尾较小元素;2)检查并移除超出窗口范围的队首元素;3)窗口形成时记录队首元素作为最大值。该方案时间复杂度为O(n),每个元素仅入队出队一次;空间复杂度O(k)。示例验证表明算法正确输出[3,3,5,5,6,7],与预期结果一致。原创 2026-01-31 22:33:15 · 450 阅读 · 3 评论 -
子串----和为K的子数组
本文探讨了求解数组中和为k的连续子数组个数的问题。首先介绍了暴力解法(双重循环枚举子数组),指出其O(n²)时间复杂度不适用于大数据量。随后提出优化方案:利用前缀和与哈希表,将问题转化为统计pre_sum[i]-k的出现次数。关键点在于初始化hash[0]=1以处理从数组起始位置开始的子数组。该方法将时间复杂度优化至O(n),空间复杂度O(n)。文章包含C++代码实现,适用于包含负数和零的数组,确保统计的是连续子数组。原创 2026-01-30 21:58:21 · 406 阅读 · 3 评论 -
滑动窗口-----找到所有字母异位词
本文介绍了一种使用滑动窗口算法在字符串s中查找所有p的字母异位词子串的方法。通过维护一个动态窗口,统计字符出现次数来快速匹配。算法初始化字符计数数组后,右指针遍历字符串,调整窗口边界确保字符匹配,当窗口大小等于p长度时记录起始索引。该方案具有线性时间复杂度O(n+m)和常数空间复杂度O(1),是解决此类子串匹配问题的高效方法。原创 2026-01-29 22:33:23 · 481 阅读 · 3 评论 -
滑动窗口---- 无重复字符的最长子串
本文介绍了使用滑动窗口算法求解字符串中最长无重复字符子串长度的问题。通过维护左右指针动态调整窗口边界,并利用计数数组检测重复字符,实现了时间复杂度O(n)和空间复杂度O(1)的解决方案。文章包含算法思想、代码实现(C++)、复杂度分析和测试用例验证,展示了滑动窗口在处理子串问题中的高效性,特别适用于需要维护连续唯一字符的场景。原创 2026-01-28 22:33:24 · 358 阅读 · 4 评论 -
双指针 --- 接雨水
本文介绍了使用双指针法解决LeetCode"接雨水"问题的思路。该问题要求计算柱子排列后能承接的雨水量,关键在于确定每个位置由左右两侧最高柱子中较矮者决定的储水量。双指针解法通过维护左右指针和两侧最大高度变量,在一次遍历中完成计算:比较两侧当前最大高度,从较小侧计算当前指针位置的储水量并移动指针。这种方法实现了O(n)时间复杂度和O(1)空间复杂度,优于传统的动态规划解法。文章提供了完整的C++代码实现,并通过示例验证了算法的正确性,最终输出结果6与题目预期一致。原创 2026-01-27 22:45:29 · 765 阅读 · 15 评论 -
双指针--双数之和
摘要:本文介绍了一种高效解决三数之和问题的方法。通过排序预处理后采用双指针策略,将时间复杂度从O(n³)优化到O(n²)。关键步骤包括:排序数组后固定第一个数,使用左右指针寻找满足条件的组合,并通过跳过重复值实现去重。当第一个数大于0时提前终止循环,进一步优化效率。该方法有效解决了暴力枚举的超时问题,同时保证了结果的正确性和唯一性。原创 2026-01-26 22:43:39 · 448 阅读 · 13 评论
分享