LeetCode算法深度解析(1至200)
文章平均质量分 89
LeetCode算法深度解析
达文汐
欢迎订阅我的专栏:Python 从入门到精通(附项目)、LeetCode算法深度解析
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode算法题源码深度解析|算法资源
本专栏提供LeetCode算法问题的解题思路与核心代码实现,以第26题(删除有序数组重复项)为例展示双指针解法。核心代码仅包含关键算法,而完整代码添加了输入处理、运行演示和详细注释,帮助理解算法执行过程。如需获取全部完整源码,可关注文末名片“达文汐”并回复算法源码。完整代码将持续更新。原创 2025-07-21 00:05:48 · 1986 阅读 · 0 评论
-
【简单】力扣算法题解析LeetCode1:两数之和
本文介绍了在整数数组中寻找两数之和等于目标值的算法。通过哈希表优化查找过程,将时间复杂度从O(n²)降至O(n)。关键思路是边遍历边检查补数是否存在,避免重复计算。Java实现中预分配哈希表容量,单次遍历时先检查后存储,确保高效性和正确性。算法通过示例验证,时间复杂度O(n),空间复杂度O(n)。原创 2025-07-16 19:40:11 · 630 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode2:两数相加
LeetCode第2题要求将两个逆序存储的非负整数链表相加,返回相同格式的结果链表。核心在于模拟手工加法:创建哑节点简化操作,初始化进位为0,同步遍历两链表,逐位求和并处理进位(当前位取sum%10,进位取sum/10)。若链表长度不等,缺位视作0;最终检查进位是否需补位。算法确保时间复杂度O(max(m,n)),空间复杂度O(max(m,n))。原创 2025-08-25 12:02:06 · 480 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode3:无重复字符的最长子串
题目要求找到字符串中最长无重复字符子串的长度。采用滑动窗口(双指针)优化解法,结合哈希数组记录字符最后出现位置。核心步骤: 初始化窗口指针 start 和哈希数组; 遍历字符串,若字符重复则移动 start 至重复位置的下一位; 实时更新最大窗口长度。 复杂度:时间 O(n),空间 O(1)(固定字符集)。Java代码通过一次遍历实现,高效处理边界情况(如空串或全唯一字符)。原创 2025-08-25 12:02:19 · 388 阅读 · 0 评论 -
【困难】力扣算法题解析LeetCode4:寻找两个正序数组的中位数
本文解决了在两个有序数组中寻找中位数的问题,要求在O(log(m+n))时间复杂度内完成。核心思路是将问题转化为寻找第k小的数,通过二分查找每次排除k/2个元素。实现时始终保持nums1为较短的数组以优化效率,处理各种边界情况,并动态更新查找范围。代码采用Java实现,包含详细注释和复杂度分析(O(log(min(m,n))))。测试用例覆盖了数组为空、元素相同、交叉数组等边界情况,确保算法正确性。原创 2025-07-16 19:56:28 · 728 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode5:最长回文子串
题目要求找到字符串中最长的回文子串,采用中心扩散法。遍历每个字符及其间隙作为中心,向两边扩展寻找最长回文子串。时间复杂度O(n²),空间复杂度O(1)。Java实现通过expandAroundCenter方法计算回文长度,更新最大子串边界后返回结果。原创 2025-07-16 19:58:05 · 359 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode6:Z字型变换
题目要求将字符串按Z字形排列后逐行读取。通过分析周期规律(长度为 2*(numRows-1)),可将字符分配到对应行:首末行每周期1个字符,中间行每周期2个字符。使用 StringBuilder 数组高效构建每行字符串,最后合并结果。Java实现时间复杂度O(n),空间复杂度O(n),高效处理边界条件如单行情况。原创 2025-07-16 20:00:17 · 366 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode7:整数反转
题目要求反转32位有符号整数,若结果溢出则返回0。核心思路是通过循环逐位提取数字并构建反转结果,同时实时检查溢出:正数超过Integer.MAX_VALUE或负数低于Integer.MIN_VALUE时终止。算法通过数学运算(取模和除法)处理正负情况,确保在32位范围内操作。时间复杂度O(log|x|),空间复杂度O(1)。Java实现通过预判乘法溢出条件,高效解决问题。 关键词: 整数反转、溢出检查、数学运算、32位限制、逐位处理原创 2025-07-16 20:01:03 · 496 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode8:字符串转换整数(atio)
本文实现了一个将字符串转换为32位有符号整数的函数myAtoi。算法步骤包括:跳过前导空格、处理符号位、读取数字字符并进行累积计算,同时处理溢出情况。关键点在于使用负数累积避免正数溢出,并在每次计算前检查是否超出32位整数范围。对于溢出情况,返回相应的最大值或最小值。该方法时间复杂度为O(n),空间复杂度为O(1),能高效处理各种边界条件。原创 2025-07-16 20:01:42 · 828 阅读 · 0 评论 -
【简单】力扣算法题解析LeetCode9:回文数
本文介绍了一种高效判断整数是否为回文数的方法。通过反转数字的后半部分并与前半部分比较,避免了完全反转可能导致的溢出问题。算法首先排除负数和末尾为零的非零数,然后在循环中逐步反转后半数字,最后比较前半部分与反转结果(或反转结果/10,针对奇数位)。该方法的时间复杂度为O(log₁₀n),空间复杂度为O(1),适合处理大整数。Java实现代码简洁,测试案例验证了其正确性。原创 2025-07-16 20:02:25 · 483 阅读 · 0 评论 -
【困难】力扣算法题解析LeetCode10:正则表达式匹配算法
本文介绍了使用动态规划解决正则表达式匹配问题的方法。题目要求实现支持 '.' 和 '*' 的模式匹配,其中 '.' 匹配任意字符,'*' 匹配零个或多个前导字符。通过构建二维状态数组 dp[i][j] 表示字符串 s 前 i 个字符与模式 p 前 j 个字符的匹配情况,采用动态规划逐步填充状态表。关键处理包括空字符串匹配、'*' 的零次或多次匹配判断。该方法时间复杂度为 O(mn),空间复杂度为 O(mn)。原创 2025-07-16 20:02:54 · 1118 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode11:盛最多水的容器
采用双指针法高效求解容器盛水问题。初始化左右指针分别指向数组两端,计算当前容量并更新最大值。关键策略是移动高度较小的指针,以寻找潜在更大容量的组合。算法时间复杂度为O(n),空间复杂度O(1)。Java实现通过循环比较和指针移动,最终返回最大储水量。原创 2025-07-17 08:37:48 · 506 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode12:整数转罗马数字
本文介绍如何将整数转换为罗马数字,通过贪心算法高效实现。关键点包括:预定义数值与罗马符号的映射(含减法形式),按从大到小顺序处理剩余数字,并利用StringBuilder优化性能。Java实现代码执行时间为3ms,内存消耗41.3MB,时间复杂度O(1)。适用于1-3999范围内的整数转换,满足题目要求的特殊规则(如4/9的减法表示等)。原创 2025-07-17 08:41:08 · 1029 阅读 · 0 评论 -
【简单】力扣算法题解析LeetCode13:罗马数字转整数
这篇文章介绍了一个将罗马数字转换为整数的算法。罗马数字由7种字符组成,每个字符对应特定数值。算法核心思想是遍历字符串,比较相邻字符的数值:若当前字符数值小于下一个字符数值,则减去当前值(处理特殊情况如IV=4);否则累加当前值。最后直接处理末尾字符的数值。通过switch语句高效获取字符对应的数值,时间复杂度O(n),空间复杂度O(1)。原创 2025-07-17 09:00:15 · 496 阅读 · 0 评论 -
【简单】力扣算法题解析LeetCode14:最长公共前缀
该算法用于查找字符串数组的最长公共前缀。采用纵向扫描法,以第一个字符串为基准,逐字符与其他字符串的同位置字符比较。若发现不匹配或长度不足,立即返回当前前缀。时间复杂度为O(S)(S为总字符数),空间复杂度O(1)。Java实现通过双重循环完成,边界处理简洁,执行高效。原创 2025-07-17 09:19:36 · 510 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode15:三数之和
本文介绍了如何高效找出数组中所有和为0的三元组。通过排序数组后固定一个数,使用双指针技术搜索剩余两数,确保解的唯一性。关键步骤包括跳过重复元素和提前终止无效搜索。该方法时间复杂度为O(n²),空间复杂度O(1)。原创 2025-07-17 09:30:38 · 420 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode16:最接近的三数之和
给定一个整数数组和目标值,找出三个数的和最接近目标值的组合。通过排序和双指针法优化搜索过程:外层循环固定一个数,内层使用双指针寻找剩余两数。通过最小/最大和优化提前终止无效循环,跳过重复元素减少计算。时间复杂度O(n²),空间复杂度O(1)。Java实现中,排序后遍历数组,结合双指针和剪枝策略高效求解,确保返回唯一最接近的和。原创 2025-07-17 10:09:53 · 487 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode17:电话号码的字母组合
该文介绍了一种采用回溯法和字符数组优化的算法,用于解决电话号码字母组合问题。通过预处理数字-字母映射关系,预分配字符数组减少内存开销,并在回溯过程中直接修改数组元素来避免字符串拼接操作。算法亮点包括零临时字符串生成、内存预分配和静态映射表共享。Java实现展示了从输入处理到回溯递归的完整流程,以输入"23"为例详细说明了执行过程。原创 2025-07-17 10:40:52 · 684 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode18:四数之和
该算法解决在数组中寻找不重复四元组使其和等于目标值的问题。通过排序数组后使用双重循环固定前两个数,结合双指针法查找后两个数,同时利用多层剪枝优化(跳过重复元素、提前终止无效分支)。使用long类型防止整数溢出,确保正确性。时间复杂度优化至O(n³),空间复杂度O(1)。代码通过5处剪枝和双指针技巧高效处理大规模数据,适用于长度≤200的数组,能正确处理大整数运算。原创 2025-07-17 11:11:06 · 895 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode19:删除链表的倒数第N个结点
本文介绍了如何删除链表倒数第n个节点的算法。关键思路是使用双指针技巧,通过快指针先移动n步,再与慢指针同步移动,最终定位待删除节点的前驱。通过引入哑节点统一处理边界情况,算法在O(L)时间复杂度和O(1)空间复杂度内完成。Java实现中,快慢指针从哑节点出发,快指针先走n步后同步移动,当快指针到达末尾时,慢指针指向待删除节点的前驱,直接修改指针完成删除。该方法高效简洁,适合处理链表操作问题。原创 2025-07-17 12:33:33 · 383 阅读 · 0 评论 -
【简单】力扣算法题解析LeetCode20:有效的括号
本文介绍了如何判断一个仅包含括号字符的字符串是否有效。通过使用栈数据结构,可以高效检查括号的匹配情况。算法首先预处理奇数长度字符串,随后遍历字符:左括号压栈,右括号检查栈顶匹配性。最终栈空则返回true。Java实现利用数组模拟栈,优化了性能,确保时间复杂度为O(n)。该方法简洁高效,适用于常见括号匹配问题。原创 2025-07-17 12:42:57 · 327 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode21:合并两个有序链表
合并两个升序链表为一个新的升序链表。通过迭代法和双指针遍历,比较节点值并链接较小值节点,复用原链表节点以优化空间(O(1))。使用哑节点简化边界处理,最后拼接剩余链表。Java实现中,dummy节点指向新链表头,循环结束后直接返回dummy.next。代码简洁高效,执行时间0ms,内存消耗41.3MB。 关键词:升序链表合并、哑节点、双指针、空间优化、O(1)复杂度原创 2025-07-17 20:09:27 · 425 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode22:括号生成
本文介绍了使用回溯法生成所有有效括号组合的算法。给定数字n,生成所有包含n对括号的有效组合。算法通过递归实现,保证左括号数不超过n,右括号数不超过左括号数。Java代码展示了回溯过程,利用StringBuilder优化性能,并通过剪枝避免无效组合。原创 2025-07-17 20:10:27 · 507 阅读 · 0 评论 -
【困难】力扣算法题解析LeetCode23:合并K个升序链表
本文介绍了如何高效合并K个有序链表的方法。通过分治法将问题分解为两两合并子任务,大幅降低时间复杂度。具体实现时,先处理边界情况,然后迭代合并链表对,最终得到完全合并的链表。算法时间复杂度为O(NlogK),其中N为总节点数,K为链表数量。Java代码展示了分治合并的核心逻辑,包括哑节点处理、双指针比较和剩余链表连接等关键步骤。原创 2025-07-17 20:11:08 · 546 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode24:两两交换链表中的节点
该题目要求两两交换链表中的相邻节点,只能通过修改节点指针实现。使用虚拟头节点简化操作,通过三指针(pre、node1、node2)迭代完成交换:保存node2的后继节点,调整pre、node2、node1的指针关系,最后移动pre到下一组的前驱位置。时间复杂度O(n),空间复杂度O(1)。原创 2025-07-17 20:11:55 · 308 阅读 · 0 评论 -
【困难】力扣算法题解析LeetCode25:K个一组翻转链表
本文介绍了如何将链表每k个节点一组进行翻转的算法。通过虚拟头节点简化处理,迭代检查剩余节点是否足够k个,不足则保留原样。对每组进行翻转时,维护前驱节点和下一段起始节点以保证正确连接。算法时间复杂度O(n),空间复杂度O(1)。Java实现中,使用双指针翻转每组节点,并通过调整指针完成段间衔接。最后返回虚拟头节点的next即新链表头,保证了代码简洁高效。原创 2025-07-17 20:12:37 · 466 阅读 · 0 评论 -
【简单】力扣算法题解析LeetCode26:删除有序数组中的重复项
要求原地删除非严格递增数组中的重复元素,并返回唯一元素的个数。使用双指针法(快慢指针)高效解决:慢指针slow标记唯一序列末尾,快指针fast遍历数组。当nums[fast]与nums[slow]不同时,将fast的值赋给slow+1位置。最终返回slow+1作为唯一元素数量。该算法时间复杂度O(n),空间复杂度O(1),满足原地修改要求。代码简洁高效,适用于有序数组去重场景。原创 2025-07-18 07:05:39 · 489 阅读 · 0 评论 -
【简单】力扣算法题解析LeetCode27:移除元素
本文介绍了原地移除数组中指定元素的双指针解法。通过维护一个指针k记录非目标值的位置,遍历数组时将符合条件的元素前移,最终k即为剩余元素数量。Java实现显示该方法高效(0ms执行时间),满足O(1)空间复杂度要求,适用于元素顺序不重要的场景。原创 2025-07-18 07:09:35 · 365 阅读 · 0 评论 -
【简单】力扣算法题解析LeetCode28:找出字符串中第一个匹配项的下标
本文介绍了一种高效的字符串匹配算法——Rabin-Karp算法(自然溢出版),用于在一个主串中查找子串首次出现的位置。算法核心思想是利用滚动哈希技术,通过预处理目标串的哈希值,然后在主串中滑动窗口计算当前子串的哈希值,若哈希匹配则进一步验证字符是否相等。该算法通过自然溢出优化取模运算,平均时间复杂度为O(n+m),空间复杂度为O(1)。文末提供了Java实现代码,并展示了在实际测试中的高效性能(0ms执行时间)。原创 2025-07-18 07:19:41 · 952 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode29:两数相除
要求在不使用乘法、除法和取余运算的情况下,实现两个整数的除法运算,结果向零截断。关键在于高效逼近被除数的绝对值,同时处理边界条件和符号问题。 方法思路 边界处理:若被除数为0,直接返回0。若被除数为Integer.MIN_VALUE且除数为-1,结果会溢出,返回Integer.MAX_VALUE。 符号确定:使用异或运算判断结果符号,两数符号不同时结果为负。 转换为负数:将被除数和除数转换为负数处理,避免正数转换时的溢出问题。 倍增法:通过不断翻倍除数和相应的倍数,快速逼近被除数。原创 2025-07-18 07:24:48 · 1043 阅读 · 0 评论 -
【困难】力扣算法题解析LeetCode30:串联所有单词的子串
本文提出了一种高效查找字符串中所有单词串联子串起始索引的算法。该算法通过预处理将单词映射为数字ID,并使用滑动窗口技术优化匹配过程。核心思路包括:1) 将单词转换为ID减少字符串操作;2) 预处理字符串中所有位置的单词ID;3) 采用滑动窗口动态维护匹配状态。原创 2025-07-18 07:24:10 · 887 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode31:下一个排列
本文介绍了如何找到整数数组的下一个字典序更大的排列。算法步骤如下: 从右向左找到第一个下降的位置i; 若存在i,再从右向左找到第一个大于nums[i]的位置j; 交换i和j位置的元素; 反转i+1到末尾的子数组使其升序排列。整体时间复杂度O(n),空间复杂度O(1)。通过原地修改数组,实现了高效查找下一个排列。原创 2025-07-18 08:01:00 · 405 阅读 · 0 评论 -
【困难】力扣算法题解析LeetCode32:最长有效括号
本文介绍了一种动态规划解法来求解最长有效括号子串问题。通过维护一个dp数组,其中dp[i]表示以s[i]结尾的最长有效括号子串长度,分两种情况处理:当遇到')'时,若前一个字符是'('则直接组合成有效对;若前一个字符是')'则检查匹配的前驱位置。算法时间复杂度为O(n),空间复杂度为O(n)。代码使用Java实现,通过遍历字符串并更新dp数组,最终返回最大值作为结果。原创 2025-07-18 08:19:34 · 487 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode33:搜索旋转排序数组
要求在旋转后的有序数组中查找目标值,要求时间复杂度为O(log n)。通过二分查找,每次判断左右两部分的有序性来确定目标值所在区间。若左半有序且目标值在左半范围内,则搜索左半;否则搜索右半。若未找到则返回-1。该方法高效利用了二分查找的特性,确保在旋转数组中快速定位目标值。原创 2025-07-18 08:41:57 · 390 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode34:在排序数组中查找元素的第一个和最后一个位置
本文介绍了在非递减数组中查找目标值起始和结束位置的算法。通过两次二分查找分别确定左右边界:左边界查找时收缩右区间,右边界查找时收缩左区间。关键点在于处理中点计算和边界条件,确保时间复杂度为O(log n)。代码实现验证了边界情况,如空数组或目标值不存在时返回[-1, -1]。原创 2025-07-18 09:04:56 · 345 阅读 · 0 评论 -
【简单】力扣算法题解析LeetCode35:搜索插入位置
要求在有序数组中查找目标值的索引或插入位置,采用二分查找算法实现O(log n)的时间复杂度。通过初始化左右指针并不断缩小搜索范围:若找到目标值则返回索引,否则循环结束时左指针即为插入位置。代码简洁高效,适用于无重复元素的升序数组。原创 2025-07-18 09:41:09 · 442 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode36:有效的数独
本文提出了一种高效验证数独有效性的算法,通过位掩码技术优化空间使用。使用三个整数数组分别记录行、列、3x3宫格内数字出现情况,将每个数字转换为位掩码进行检测。遍历9x9网格时,检查当前数字在位掩码中是否冲突,若无冲突则更新掩码。宫格索引通过(i/3)*3 + j/3计算。该方法仅需27个整数的存储空间,利用位运算实现高效检测,时空复杂度均为O(1)。Java实现代码简洁,通过字符转换、位运算和索引计算快速验证数独有效性。原创 2025-07-18 10:05:42 · 906 阅读 · 0 评论 -
【困难】力扣算法题解析LeetCode37:解数独
本文介绍了一种使用回溯法和位运算优化解决数独问题的高效算法。该算法通过三个位图数组记录每行、每列和每个3x3宫格中已出现的数字,预先收集所有空格位置,然后在深度优先搜索过程中利用位运算快速计算可用数字,依次尝试填充并回溯。这种方法显著减少了无效尝试,保证了算法的高效性。Java实现中通过位运算操作和预收集空格位置优化性能,适合解决唯一解的数独问题。原创 2025-07-18 10:39:25 · 754 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode38:外观数列
本文介绍了「外观数列」问题及其解法。外观数列由递归定义,第n项是第n-1项的行程长度编码。解题采用迭代方法,优化双指针统计连续字符,预分配空间减少扩容开销。Java实现通过字符数组和StringBuilder高效拼接,时间复杂度O(L),空间复杂度O(L)。原创 2025-07-18 11:18:27 · 367 阅读 · 0 评论 -
【中等】力扣算法题解析LeetCode39:组合总和
本文介绍了一种使用回溯算法解决组合总和问题的方案。给定无重复元素的整数数组和目标值,要求找出所有和为目标的组合(数字可重复使用)。通过排序候选数组并采用深度优先搜索(DFS)进行回溯,结合剪枝优化(当当前数字大于剩余目标值时终止搜索),有效减少了无效路径的遍历。算法通过控制搜索索引避免重复组合,动态维护路径列表并在找到有效解时保存结果。Java实现展示了排序、递归回溯和剪枝的关键步骤,确保了算法的高效性和正确性。原创 2025-07-18 11:45:48 · 496 阅读 · 0 评论
分享