- 博客(62)
- 收藏
- 关注
原创 LeetCode:20. 有效的括号
摘要 本文提供了两种Java解法来验证括号字符串的有效性。第一种解法使用栈结构,遇到左括号入栈,遇到右括号则检查栈顶元素是否匹配。第二种解法利用哈希表存储括号映射关系,同样基于栈进行匹配验证。两种方法都通过检查栈是否为空来判断最终有效性,时间复杂度均为O(n)。第一种解法代码更简洁,第二种通过映射关系提高了代码可读性但效率略低。核心思路都是利用栈的先进后出特性来确保括号的正确嵌套顺序。
2026-06-03 14:37:22
219
原创 LeetCode:17. 电话号码的字母组合
题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/解决方式:字符串 + 回溯法(DFS、递归)/ 队列迭代法(BFS、队列)深度优先搜索(DFS):从第一个数字开始,依次为每个数字选择一个字母,组合成字符串。回溯:每完成一个完整组合(到达叶子节点)后,撤销最后一步的选择,尝试下一个分支。路径维护:使用动态构建当前组合,避免频繁创建新字符串。这就是回溯法解决该题目的完整流程。
2026-05-31 15:36:18
222
原创 LeetCode:5. 最长回文子串
本文介绍了两种求解最长回文子串的方法:暴力枚举和中心扩展法。暴力枚举通过双重循环检查所有子串是否为回文,时间复杂度较高(O(n³))。中心扩展法更高效(O(n²)),它从每个可能的中心点向两侧扩展寻找最长回文子串,考虑了奇偶长度的情况。两种方法都维护全局最大回文子串并实时更新。中心扩展法通过统一处理奇数中心和偶数中心,或者分别处理两种情况,提供了更优的解决方案。
2026-05-30 17:54:36
263
原创 LeetCode:543. 二叉树的直径
本文介绍了如何计算二叉树的最大直径(任意两节点间最长路径)。通过递归遍历每个节点,计算其左右子树的深度之和作为当前节点直径,并维护一个全局最大值。算法在计算节点深度的同时更新最大直径,时间复杂度为O(n)。关键点在于将深度计算与直径统计结合,在递归返回节点深度时同步比较更新最大直径值。该方法简洁高效,只需对二叉树进行一次遍历即可得到结果。
2026-05-30 15:50:57
212
原创 LeetCode:581. 最短无序连续子数组
本文介绍了两种求解最短无序连续子数组的方法。第一种是排序后比较法:复制原数组并排序,通过比较找出第一个和最后一个不同元素的位置来确定子数组范围。第二种是双指针法:通过两次遍历分别确定右边界(当前元素小于已遍历最大值的位置)和左边界(当前元素大于已遍历最小值的位置),两者间的子数组即为所求。双指针法的时间复杂度为O(n),空间复杂度为O(1),优于排序法的O(n log n)时间复杂度。两种方法都能准确找出需要排序的最短连续子数组长度。
2026-05-29 10:57:47
230
原创 LeetCode:647. 回文子串
本文介绍了两种计算字符串中回文子串数量的方法:暴力枚举法和中心扩展法。暴力枚举法通过双重循环检查所有子串是否为回文,时间复杂度为O(n³)。中心扩展法更高效,通过枚举所有可能的中心点(奇数和偶数长度)并向两侧扩展验证回文,时间复杂度优化至O(n²)。后者利用双指针技术,显著提升了算法效率,是解决此类问题的推荐方法。两种方法均能正确统计回文子串数量,但中心扩展法性能更优。
2026-05-28 15:17:15
62
原创 LeetCode:739. 每日温度
本文介绍了LeetCode每日温度问题的两种解法:暴力枚举和单调栈。暴力枚举通过双重循环直接比较温度,时间复杂度较高。单调栈则通过维护一个递减栈实现一次遍历,当遇到更高温度时出栈并记录天数差,效率更高。两种方法均返回等待更暖温度的天数数组,但单调栈的时间复杂度优化至O(n),更适合处理大规模数据。
2026-05-28 14:56:05
66
原创 LeetCode:96. 不同的二叉搜索树
本文介绍了使用动态规划解决LeetCode上"唯一二叉搜索树"问题的方法。该问题本质上是计算卡特兰数,通过构建动态规划数组dp,其中dp[i]表示i个节点能构成的二叉搜索树数量。初始化dp[0]=1后,通过双重循环计算每个dp[i]的值,最终返回dp[n]作为结果。时间复杂度为O(n²),空间复杂度为O(n)。
2026-05-26 15:33:54
43
原创 LeetCode:617. 合并二叉树
本文介绍了合并两棵二叉树的递归解法。通过同时遍历两棵树的对应节点,当任一节点为空时返回另一节点,否则创建新节点并递归处理左右子树。该方法时间复杂度为O(n),空间复杂度为O(n),其中n为节点数。核心思路是先处理左子树再处理右子树,最终返回合并后的新二叉树。
2026-05-26 15:26:26
43
原创 LeetCode:101. 对称二叉树
本文介绍了LeetCode上判断二叉树是否对称的递归解法。通过比较左右子树的镜像对称性,即左子树的左节点与右子树的右节点、左子树的右节点与右子树的左节点是否相等,递归地进行验证。代码实现简洁,边界条件处理完善,时间复杂度为O(n)。该方法直观地体现了二叉树对称性的本质特征。
2026-05-26 15:08:47
49
原创 LeetCode:94. 二叉树的中序遍历
本文介绍了二叉树中序遍历的递归解法。中序遍历顺序为左子树-根节点-右子树,通过递归实现这一访问顺序。代码使用Java实现,定义inorder方法递归遍历左右子树,并将节点值按顺序存入列表。该方法边界条件为节点为空时返回,核心只需调整递归调用顺序即可实现前序、后序遍历。文章推荐参考其他解题思路来提升算法能力。
2026-05-25 16:42:31
81
原创 LeetCode:42. 接雨水
文章摘要:本文介绍了解决LeetCode“接雨水”问题的三种方法。暴力枚举法通过遍历每个柱子,计算左右两侧最高柱子的较小值与当前柱子的差值来累计水量。动态规划法通过预计算左右两侧最大值数组来优化时间复杂度。双指针法则在O(1)空间复杂度下,通过左右指针动态调整来计算水量。三种方法逐步优化,从O(n²)到O(n)时间复杂度,最后达到最优解。
2026-04-14 15:01:31
66
原创 LeetCode:438. 找到字符串中所有字母异位词
本文介绍了在字符串中查找所有字母异位词的三种滑动窗口解法。哈希表法通过维护need和window两个哈希表来统计字符频率,当窗口长度等于目标字符串时检查valid变量;数组法使用两个数组分别记录窗口和目标字符频率,通过全量比较判断异位词;优化数组法则维护一个count数组和differ变量,减少比较次数。三种方法均采用固定窗口大小的滑动策略,时间复杂度为O(n),适用于字符串匹配问题。
2026-04-07 11:16:47
69
原创 LeetCode:387. 字符串中的第一个唯一字符
本文介绍了三种解决字符串中第一个唯一字符问题的方法。暴力枚举法通过双重循环统计字符出现次数,时间复杂度高(O(n²))。哈希表法通过两次单循环(第一次统计字符出现次数,第二次查找唯一字符)优化至O(n)。数组法进一步优化,利用字符ASCII特性直接通过数组索引访问,效率更高。三种方法逐步优化,最终数组法在时间和空间复杂度上都表现最优。
2026-04-07 10:41:33
73
原创 LeetCode:567. 字符串的排列
摘要:本文介绍了LeetCode题目"字符串的排列"的滑动窗口解法。通过维护两个哈希表分别记录目标字符串和当前窗口的字符频率,当窗口长度等于目标字符串长度时检查是否满足排列条件。该解法与76题最小覆盖子串类似,但收缩条件改为固定窗口长度。时间复杂度为O(n),空间复杂度为O(1)。作者建议参考其他优秀题解来拓展解题思路。
2026-04-02 14:54:41
76
原创 LeetCode:202. 快乐数
本文介绍了使用双指针法判断快乐数的算法。通过快慢指针遍历数字变换过程,快指针每次计算两次数字平方和,慢指针计算一次。若存在循环则指针会相遇,否则最终都会收敛到1。算法时间复杂度为O(logn),空间复杂度O(1)。关键点在于将问题转化为循环检测,并通过双指针高效判断。代码实现包含主函数和计算数字各位平方和的辅助函数。
2026-03-31 16:27:30
57
原创 LeetCode:217. 存在重复元素
本文介绍了四种判断数组中是否存在重复元素的方法:1.利用哈希集合的去重特性,比较集合和数组大小;2.利用集合添加重复元素返回false的特性;3.直接使用哈希表存储判断;4.先排序再检查相邻元素。前三种方法时间复杂度为O(n),第四种为O(nlogn)。其中哈希集合和哈希表解法空间复杂度为O(n),排序解法为O(1)。代码示例均使用Java实现,提供了清晰的思路和实现方式。
2026-03-30 15:01:05
64
原创 LeetCode:128. 最长连续序列
摘要 该文介绍了LeetCode上"最长连续序列"问题的哈希集合解法。通过将数组元素存入哈希集合实现去重和快速查找,算法核心是寻找连续序列的起点(即当前元素x的前驱x-1不存在时),然后向后查找连续数字。时间复杂度为O(n),空间复杂度O(n)。文章推荐参考灵茶山艾府的题解,并提供了Java实现代码,通过比较不同起点的序列长度来获取最终结果。
2026-03-30 10:11:36
64
原创 LeetCode:49. 字母异位词分组
本文介绍了两种哈希表方法解决字母异位词分组问题。第一种通过字符串排序构建唯一键,将排序后相同的字符串归为一组;第二种通过统计字符出现次数并拼接成字符串作为键。两种方法都利用哈希表将字母异位词映射到相同键值,实现高效分组。时间复杂度分别为O(nklogk)和O(nk),其中n是字符串数量,k是字符串最大长度。
2026-03-26 14:40:13
74
原创 LeetCode:1. 两数之和
摘要:本文介绍了LeetCode两数之和问题的两种解法。暴力枚举法通过双重循环匹配元素,时间复杂度O(n²)。哈希表法利用哈希表存储目标差值,只需一次遍历即可找到解,时间复杂度O(n)。两种方法的空间复杂度分别为O(1)和O(n)。哈希表解法通过空间换时间,显著提高了算法效率。
2026-03-26 10:27:44
49
原创 LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置
本文介绍了在有序数组中查找目标元素首次和末次出现位置的二分查找方法。通过修改标准二分查找算法,先找到目标元素的左边界,再通过查询目标值+1的左边界来确定原目标值的右边界。文章提供了两种实现方式:基础版本和优化版本,后者通过缩小第二次二分查找的范围来提升效率。两种方法都采用闭合区间的二分查找策略,时间复杂度为O(log n)。该解法适用于需要快速定位元素在有序数组中范围的场景。
2026-03-26 10:09:54
55
原创 LeetCode:704. 二分查找
本文介绍了二分查找算法在有序数组中的应用。通过初始化左右指针并计算中间点,逐步收缩搜索区间来查找目标值。文章提供了基础二分查找的Java实现,以及寻找左右边界的拓展方法。在寻找边界时,当中间值等于目标值时继续收缩区间,并处理可能的越界情况。这些方法为解决类似问题(如LeetCode 34题)提供了参考思路。
2026-03-25 16:19:22
80
原创 LeetCode:215. 数组中的第K个最大元素
本文介绍了两种在数组中查找第k大元素的算法。第一种采用分治法(快速选择),通过随机选择哨兵将数组分为大、等、小三个子数组,递归处理目标所在子数组,直到找到结果,时间复杂度接近O(n)。第二种使用内置排序算法(如Arrays.sort())后直接取第k大元素,时间复杂度为O(nlogn)。两种方法各有优势:分治法效率更高但实现复杂,内置排序简单直接但性能稍差。文章推荐参考Krahets的详细讲解来深入理解分治法的实现思路。
2026-03-24 15:31:58
80
原创 LeetCode:198. 打家劫舍
本文介绍了LeetCode上"打家劫舍"问题的动态规划解法。通过定义状态(前k个房间最大金额)和状态转移方程(k-1房间是否偷窃),给出了经典解法(使用数组存储中间结果)和空间优化版本(仅用两个变量)。代码展示了如何递推计算最大金额,优化版将空间复杂度降至O(1)。文章推荐参考nettee的题解来深入理解解题思路。
2026-03-23 18:02:21
77
原创 LeetCode:148. 排序链表
本文介绍了使用分治法解决链表排序问题的思路。通过递归将链表不断二分,直到无法再分,然后利用双指针合并两个有序链表。关键步骤包括:1) 使用快慢指针找到链表中点进行分割;2) 递归处理两个子链表;3) 合并两个有序链表。该方法需要掌握两个前置知识:链表中点查找和有序链表合并。代码实现清晰展示了分治法的三个核心步骤:分割、递归处理和合并,时间复杂度为O(nlogn)。
2026-03-23 11:25:00
53
原创 LeetCode:876. 链表的中间结点
本文介绍了使用双指针法求解链表中点问题的思路。通过设置快慢两个指针,快指针每次走两步,慢指针每次走一步,当快指针到达链表末尾时,慢指针正好位于中点。对于偶数节点的情况,慢指针会指向中间两个节点的后者。代码实现简洁高效,时间复杂度为O(n)。该方法巧妙地利用指针速度差定位中点,是解决链表中间节点问题的经典方案。
2026-03-20 15:16:03
43
原创 LeetCode:121. 买卖股票的最佳时机
本文介绍了一种使用贪心算法解决股票买卖时机问题的方法。通过维护两个变量(历史最低成本和历史最高利润),在遍历股价数组时不断更新这两个值:每次迭代记录当前最低买入价,并计算当前卖出可能获得的最高利润。最终返回整个过程中的最大利润值。该方法时间复杂度为O(n),空间复杂度为O(1),是解决该问题的经典高效方案。
2026-03-19 17:26:20
62
原创 LeetCode:2. 两数相加
摘要 本文介绍了LeetCode上"两数相加"问题的链表解法。使用双指针分别遍历两个链表,逐位相加并处理进位问题。关键点包括:1)使用伪头节点防止链表丢失;2)处理不同长度链表时高位补零;3)计算进位和余数;4)最高位可能的额外进位处理。时间复杂度O(max(m,n)),空间复杂度O(max(m,n)),其中m,n为两链表长度。代码清晰展示了如何处理链表节点的遍历、相加和进位操作。
2026-03-19 17:08:46
40
原创 LeetCode:19. 删除链表的倒数第 N 个结点
摘要 本文介绍了一种使用双指针法删除链表倒数第n个节点的解法。关键点在于: 创建伪头节点处理删除头节点的情况 使用两个指针保持固定间距(n)移动 当前指针到达末尾时,后指针正好指向目标节点的前驱 时间复杂度O(L),空间复杂度O(1) 该方法通过固定间距的双指针遍历,巧妙定位倒数第n个节点,是一种高效的链表操作技巧。
2026-03-18 15:38:27
48
原创 LeetCode:83. 删除排序链表中的重复元素
本文介绍了使用双指针方法解决LeetCode上"删除排序链表中的重复元素"问题。解法利用当前节点和其next指针作为双指针,通过比较相邻节点值,重复时跳过下一节点,否则移动当前节点。该方法只需单次遍历,时间复杂度O(n),空间复杂度O(1)。代码简洁高效,推荐参考画手大鹏的题解获取更详细解析。
2026-03-18 14:24:53
48
原创 LeetCode:206. 反转链表
本文介绍了反转链表的两种解法:双指针法和递归法。双指针法通过两个指针逐个反转节点指向,需注意保存下一节点防止丢失。递归法则先递推至尾节点,回归时依次反转节点指向。两种方法时间复杂度均为O(n),空间复杂度分别为O(1)和O(n)。推荐参考灵茶山艾府等大神的题解深入学习。
2026-03-17 17:42:20
61
原创 LeetCode:21. 合并两个有序链表
本文介绍了合并两个有序链表的两种解法:双指针法和递归法。双指针法通过创建新链表,比较两个链表节点值大小依次连接,使用pre指针维护新链表。递归法则通过比较节点值,在递归过程中将较小节点连接到后续递归结果上。两种方法时间复杂度均为O(n),空间复杂度分别为O(1)和O(n)。文章推荐参考"腐烂的橘子"和"Krahets"的题解以获得更直观理解。
2026-03-17 12:45:27
68
原创 LeetCode:88. 合并两个有序数组
本文介绍了合并两个有序数组的双指针解法。该方法采用倒序遍历的方式,利用nums1数组末尾的空闲空间,避免了从前往后遍历时频繁移动元素的低效操作。具体实现中,使用三个指针分别指向nums1有效元素末尾、nums2末尾和合并后数组末尾,通过比较两数组元素大小决定移动顺序,直到nums2所有元素合并完成。该解法时间复杂度为O(m+n),空间复杂度O(1),是一种高效且节省空间的解决方案。
2026-03-16 12:38:42
37
原创 LeetCode:70. 爬楼梯
本文介绍了LeetCode爬楼梯问题的三种解法:递归、记忆化搜索和动态规划。递归解法直接但效率低,会重复计算;记忆化搜索通过存储中间结果优化递归;动态规划通过状态转移方程高效求解,并提供了空间优化版本。推荐参考灵茶山艾府的题解,掌握从简单递归到高效动态规划的解题思路演进过程,理解不同方法的时间空间复杂度差异。
2026-03-15 15:56:43
78
原创 LeetCode:53. 最大子数组和
本文介绍了使用动态规划解决最大子数组和问题(LeetCode 53题)的两种方法。第一种非空间最优解法通过定义dp数组存储以当前元素结尾的子数组最大值,状态转移时根据前一位dp值是否大于0决定是否累加。第二种空间优化解法仅使用单个变量记录当前dp值,大幅降低空间复杂度但可读性较差。两种方法都通过遍历数组并比较当前最大值来求解,时间复杂度均为O(n)。推荐参考liweiwei1419的题解获取更多解题思路。
2026-03-14 16:34:38
56
原创 LeetCode:27. 移除元素
本文介绍了LeetCode上"移除元素"问题的双指针解法。通过使用快慢指针技巧,快指针遍历数组,慢指针记录非目标值的位置。当快指针遇到不等于目标值的元素时,将其复制到慢指针位置并后移慢指针。这种方法时间复杂度为O(n),空间复杂度为O(1),能高效地原地修改数组。作者推荐参考宫水三叶的题解来深入理解该解法,并提供了Java实现代码,包含边界处理、双指针逻辑和结果返回部分。
2026-03-13 13:35:48
46
原创 LeetCode:26. 删除有序数组中的重复项
本文介绍了使用双指针法解决LeetCode上"删除有序数组中的重复项"问题。通过维护两个指针p和q,p指向当前唯一序列末尾,q遍历数组寻找不同元素。当找到不同元素时,将其放入p+1位置并移动指针。优化版本添加了防止自我覆盖的判断。两种方法的时间复杂度均为O(n),空间复杂度O(1)。该方法高效地实现了原地删除重复元素并返回新长度。
2026-03-13 12:43:15
63
原创 LeetCode:1162. 地图分析
本文介绍了一种使用广度优先搜索(BFS)算法解决LeetCode"离陆地最远的海洋"问题的方案。该算法从所有陆地网格同时出发,通过逐层向外扩展的方式寻找最远的海洋网格。实现时将所有陆地坐标加入队列,然后通过四方向移动不断扩展海洋区域,并将访问过的海洋标记为已处理。最终返回扩展的最大层数即为答案。这种方法有效避免了重复处理,时间复杂度为O(n²)。文章推荐参考其他优秀题解来深入理解该算法的实现细节。
2026-03-12 16:37:50
50
原创 LeetCode:102. 二叉树的层序遍历
本文介绍了两种广度优先搜索算法实现二叉树层序遍历的方法。第一种使用双数组,分别存储当前层节点和下一层节点,通过循环迭代完成遍历;第二种采用队列结构,利用队列先进先出特性,每次处理当前层节点时将其子节点入队。两种方法都能有效实现层序遍历,队列方法在空间效率上更优。两种解法的时间复杂度均为O(n),空间复杂度为O(n)。
2026-03-11 17:53:41
62
原创 LeetCode:111. 二叉树的最小深度
本文介绍了使用深度优先搜索(DFS)递归方法求解二叉树最小深度的算法。通过递归遍历二叉树,在遇到叶子节点时比较当前深度与全局最小深度,更新最小值。文章提供了基础实现代码,并进一步优化加入"最优性剪枝"策略:当当前深度超过已知最小深度时提前终止递归,提高效率。关键点包括:初始化全局最小深度为最大值、递归传递当前深度、在叶子节点更新最小值、空节点处理等。优化后的算法减少了不必要的递归调用,提升了性能。
2026-03-11 16:52:43
41
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅