LeetCode
文章平均质量分 82
·云扬·
欢迎访问我的个人知识库:https://www.yuque.com/yuqueyonghunujzjn
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Leetcode hot 100】287.寻找重复数
摘要: LeetCode 287题要求在一个长度为n+1的数组(元素范围为[1,n])中找到唯一重复的数字,且不能修改数组并使用O(1)空间。两种主要解法:1)快慢指针法(时间复杂度O(n)),将数组视为链表,通过Floyd算法找到环的入口即为重复数;2)二分查找法(时间复杂度O(n log n)),基于抽屉原理统计小于等于中间值的元素个数来缩小范围。两种方法均满足空间约束,快慢指针效率更高但较难理解,二分查找更直观但稍慢。常见误区包括排序法、哈希表法等会违反题目约束的解法。原创 2025-11-20 09:12:03 · 908 阅读 · 0 评论 -
【Leetcode hot 100】31.下一个排列
该问题要求在给定整数数组中找到字典序中的下一个更大排列,若不存在则返回最小排列(升序排列)。关键步骤如下:1.从后往前找第一个小于其后元素的索引k;2.若不存在k则翻转整个数组;3.否则找到k后从后往前找第一个大于nums[k]的索引l,交换nums[k]和nums[l],再翻转k+1到末尾部分。解法时间复杂度O(n),空间复杂度O(1)。例如[1,2,3]的下一个排列是[1,3,2],而[3,2,1]的下一个排列是[1,2,3]。原创 2025-11-19 09:42:51 · 373 阅读 · 0 评论 -
【Leetcode hot 100】 75.颜色分类
摘要 本文分析了LeetCode 75题"颜色分类"的两种解法。题目要求将包含0、1、2的数组原地排序为0→1→2的顺序。解法1采用计数排序:先统计各数字出现次数,再按顺序填充数组,时间复杂度O(n)(两趟遍历),空间O(1)。解法2使用三指针法:通过left、right、curr指针一次遍历完成排序,left标记0的右边界,right标记2的左边界,curr遍历并交换元素,实现O(n)时间复杂度和O(1)空间复杂度。两种方法各有优劣:计数排序简单直观,适合初学者;三指针法效率更高,是面原创 2025-11-18 10:46:19 · 586 阅读 · 0 评论 -
【Leetcode hot 100】169.多数元素
本文讨论了LeetCode 169题"多数元素"的三种解法:1)哈希表计数法(O(n)时间,O(n)空间),通过统计元素出现次数提前终止;2)排序取中位数法(O(n logn)时间,O(logn)空间),利用多数元素必然位于排序后数组中间的特性;3)摩尔投票法(O(n)时间,O(1)空间),通过抵消不同元素最终确定多数元素。摩尔投票法是最优解,满足高效和低空间消耗要求,推荐优先使用。原创 2025-11-17 09:46:21 · 249 阅读 · 0 评论 -
【LeetCode Hot 100】 136. 只出现一次的数字
摘要: 题目要求在非空整数数组中找出唯一出现一次的数字(其他数字均出现两次),要求O(n)时间复杂度和O(1)空间复杂度。最优解法是位运算(异或),利用异或的交换律、归零性和恒等性,遍历数组将所有元素异或,最终结果即为目标数字(如4^1^2^1^2=4)。Java实现仅需1个变量存储异或结果,时间复杂度O(n),空间复杂度O(1)。其他解法如哈希表(O(n)空间)或固定长度数组(依赖值域约束)均非最优。异或运算完美满足题目双重要求,是最简洁高效的解决方案。原创 2025-11-15 21:47:45 · 487 阅读 · 0 评论 -
【Leetcode hot 100】72.编辑距离
摘要: LeetCode 72题要求计算将word1转为word2的最小操作数(插入、删除、替换)。采用动态规划,定义dp[i][j]为word1前i个字符转word2前j字符的最少操作数。状态转移分两种情况:字符匹配时dp[i][j]=dp[i-1][j-1];不匹配时取替换、删除、插入三种操作的最小值+1。初始边界处理空字符串情况。空间复杂度可优化至O(min(m,n))。该解法是字符串动态规划的典型应用,时间复杂度O(mn)。原创 2025-11-14 09:30:00 · 602 阅读 · 0 评论 -
【Leetcode hot 100】1143.最长公共子序列
本文探讨了求解两个字符串最长公共子序列(LCS)的动态规划方法。核心思路是通过定义子问题状态dp[i][j],表示两字符串前缀的LCS长度。当字符相同时扩展子序列,不同时取两种删除情况的最大值。基础解法使用二维数组,时间空间复杂度均为O(mn)。优化解法压缩为一维数组,空间复杂度降至O(min(m,n))。关键点在于合理定义状态转移方程和逆向遍历实现空间优化。原创 2025-11-13 11:03:00 · 631 阅读 · 0 评论 -
【Leetcode hot 100】5.最长回文子串
本文介绍了两种解决最长回文子串问题的算法:中心扩散法和动态规划法。中心扩散法从所有可能的回文中心向两边扩展验证,时间复杂度O(n²),空间复杂度O(1),实现简单高效。动态规划法利用dp数组记录子串回文状态,同样时间O(n²)但空间O(n²)。对比显示中心扩散法更优,适合实际应用;动态规划法有助于理解子问题分解思想。两种方法均能有效解决问题,可根据需求选择。原创 2025-11-12 09:43:01 · 624 阅读 · 0 评论 -
【Leetcode hot 100】64.最小路径和
摘要: 本文解决LeetCode 64题的最小路径和问题,要求从网格左上角到右下角找一条数字总和最小的路径。通过动态规划分析,发现每个位置的最小路径和仅依赖上方和左侧的值。提供了两种解法:1)使用额外DP数组清晰实现状态转移(空间O(mn));2)原地修改网格优化空间(空间O(1))。两种方法均需遍历整个网格,时间复杂度为O(mn)。最终返回右下角的值即为最小路径和。关键点在于边界初始化(第一行/列只能单向移动)和状态转移方程的设计。原创 2025-11-11 10:31:36 · 348 阅读 · 0 评论 -
【Leetcode hot 100】62.不同路径
本文介绍了两种求解机器人网格路径问题的方法。动态规划法通过二维或一维DP数组逐步累积路径数,时间复杂度O(mn),空间复杂度可优化至O(min(m,n))。组合数学法利用阶乘公式直接计算组合数,时间复杂度O(min(m,n))且空间O(1),效率最高。推荐优先使用组合数学法,而动态规划有助于理解问题求解思路。两种方法各有优势,可根据实际需求选择。原创 2025-11-10 09:37:11 · 809 阅读 · 0 评论 -
【Leetcode hot 100】153.寻找旋转排序数组中的最小值
摘要: 题目要求在旋转排序数组(元素互不相同)中找到最小值,需满足O(log n)时间复杂度。采用二分查找法,通过比较中间元素与右边界元素,判断最小值所在区间:若nums[mid]>nums[right],最小值在右侧;否则在左侧。最终当left与right重合时,即为最小值位置。测试验证了算法正确性,时间复杂度为O(log n),空间复杂度为O(1)。原创 2025-11-08 21:17:37 · 560 阅读 · 0 评论 -
【Leetcode hot 100】32.最长有效括号
摘要:本文探讨了LeetCode第32题"最长有效括号"的两种解法。动态规划法通过定义dp[i]表示以字符i结尾的最长有效括号长度,区分两种匹配情况(前字符'('或')')进行状态转移。栈解法则利用栈记录无效位置,通过哨兵简化计算,匹配时更新最长长度。两种方法均为O(n)时间复杂度,动态规划更直观体现长度连续性,栈法通过哨兵简化边界处理。根据场景偏好选择适合的解法即可。原创 2025-11-07 10:23:55 · 968 阅读 · 0 评论 -
【Leetcode hot 100】416.分割等和子集
摘要: 题目要求判断能否将正整数数组分为两个等和子集。解法核心是将问题转化为判断是否存在子集和等于总和一半。通过动态规划,定义 dp[j] 表示能否组成和为 j 的子集,并采用反向遍历避免重复计数。关键剪枝包括:总和为奇数直接返回 false,以及最大元素超过目标和时排除。最终检查 dp[target] 即可得到答案。该算法时间复杂度为 O(n×target),空间复杂度为 O(target)。原创 2025-11-06 09:01:55 · 904 阅读 · 0 评论 -
【Leetcode hot 100】152.乘积最大子数组
摘要 本文探讨了LeetCode 152题"乘积最大子数组"的两种解法。该问题的核心在于处理乘积运算中负数反转和零截断的特殊情况。解法一采用动态规划,通过维护当前最大/最小乘积变量,在O(n)时间、O(1)空间内求解。解法二利用左右遍历法,通过两次扫描处理奇数个负数的情况。两种方法均能高效解决问题,其中动态规划更具通用性,可推广到类似需要维护正负极值的问题场景。原创 2025-11-05 10:21:16 · 464 阅读 · 0 评论 -
【Leetcode hot 100】300.最长递增子序列
摘要: 本文探讨了求解最长严格递增子序列(LIS)的两种方法。基础解法采用动态规划(DP),定义 dp[i] 为以 nums[i] 结尾的LIS长度,通过双重遍历实现,时间复杂度为 O(n²)。进阶解法利用二分查找维护 tails 数组,记录不同长度LIS的最小末尾元素,优化至 O(n log n)。动态规划适合小规模数据,二分法适用于大规模场景。边界情况如单元素、全递减或重复数组需特殊处理。两种方法均确保严格递增性,空间复杂度均为 O(n)。原创 2025-11-04 12:24:01 · 509 阅读 · 0 评论 -
【Leetcode hot 100】139.单词划分
摘要: 该问题要求判断给定字符串s是否能由字典wordDict中的单词拼接组成。采用动态规划解法,定义dp[i]表示s的前i个字符能否拆分。初始条件dp[0]=true,递推时遍历所有可能的拆分点j,若前j个字符可拆分且s.substring(j,i)在字典中,则dp[i]=true。通过哈希集合优化查询效率,并利用字典最长单词长度减少无效遍历。最终返回dp[n]。时间复杂度优化至O(n*maxLen),空间复杂度为O(n+m)。示例验证表明算法正确性。原创 2025-11-03 11:24:17 · 743 阅读 · 0 评论 -
【Leetcode hot 100】295.数据流的中位数
摘要:本题要求实现一个动态计算数据流中位数的类。通过使用对顶堆结构(大顶堆存储较小的一半元素,小顶堆存储较大的一半元素),在每次添加元素时维护两堆的平衡,确保大顶堆始终比小顶堆多0或1个元素。插入操作时间复杂度为O(log n),查询中位数只需O(1)。关键点包括:1) 元素按大小分配到对应堆;2) 调整堆大小差不超过1;3) 奇数取大顶堆顶,偶数取两堆顶平均值。该方法高效解决了动态数据流的中位数计算问题。原创 2025-11-01 20:59:41 · 957 阅读 · 0 评论 -
【Leetcode hot 100】347.前K个高频元素
摘要 题目要求从整数数组中找出出现频率前k高的元素。解法一使用最小堆(优先队列)统计频率并维护大小为k的堆,时间复杂度为O(n log k)。解法二采用桶排序,构建频率桶后从高频到低频收集元素,时间复杂度优化至O(n)。两种方法均满足题目要求,其中桶排序效率更优。测试示例验证了算法的正确性。原创 2025-10-31 10:20:21 · 606 阅读 · 0 评论 -
【Leetcode hot 100】55.跳跃游戏
摘要: 55.跳跃游戏要求判断能否从数组起始点跳到终点。最优解法是贪心算法:遍历数组,维护当前能到达的最远位置maxReach。若当前位置在maxReach范围内,更新maxReach;若超出范围则失败;若覆盖终点则成功。时间复杂度O(n),空间O(1)。也可倒序遍历,从终点回溯到起点。动态规划解法(O(n²))效率较低但易于理解。贪心法(正序/倒序)是实际首选,动态规划适合辅助学习。原创 2025-10-30 10:07:35 · 709 阅读 · 0 评论 -
【Leetcode hot 100】121.买卖股票的最佳时机
摘要: 题目要求在股票价格数组中找到买入和卖出时机以获得最大利润,且卖出必须发生在买入之后。最优解法通过一次遍历实现:维护历史最低价 minPrice 和当前最大利润 maxProfit,遍历时更新这两个变量。时间复杂度 O(n),空间复杂度 O(1)。动态规划解法思路类似,通过状态转移方程计算每日最大利润。两种方法均高效,适用于大规模数据。原创 2025-10-29 21:32:40 · 333 阅读 · 0 评论 -
【Leetcode hot 100】215.数组中的第K个最大元素
输入: [3,2,3,1,2,4,5,5,6], k = 4。输入: [3,2,1,5,6,4], k = 2。请注意,你需要找的是数组排序后的第。你必须设计并实现时间复杂度为。个最大的元素,而不是第。原创 2025-10-28 21:22:39 · 282 阅读 · 0 评论 -
【Leetcode hot 100】84.柱状图中最大的矩形
本文介绍了求解柱状图中最大矩形面积的两种方法。最优解是使用单调栈,时间复杂度O(n),空间复杂度O(n),通过维护递增栈快速确定每个柱子的左右边界,适用于大规模数据。暴力解法时间复杂度O(n²),通过遍历每个柱子寻找左右边界,仅适用于小规模数据理解问题本质。推荐使用单调栈方法解决该问题,其效率更高且能处理大数据量情况。原创 2025-10-27 09:46:56 · 337 阅读 · 0 评论 -
【Leetcode hot 100】739.每日温度
本文介绍了两种解决「每日温度」问题的方法。暴力解法通过双重循环直接查找每个温度的下一个更高温度,时间复杂度为O(n²),适用于小规模数据。单调栈解法利用递减栈存储温度索引,在O(n)时间内高效解决问题,尤其适合大规模数据(如n=10⁵)。两种方法对比显示,单调栈解法在时间和空间效率上更优,是实际工程中的推荐选择。原创 2025-10-25 22:15:01 · 879 阅读 · 0 评论 -
【Leetcode hot 100】322.零钱兑换
本文介绍了解决「零钱兑换」问题的动态规划方法。通过定义dp数组记录凑成每个金额的最少硬币数,从0开始逐步推导到目标金额。关键步骤包括初始化dp数组、状态转移方程(取最小值)以及边界处理。优化技巧包括对硬币数组排序以减少无效遍历。Java实现中,处理特殊情况后填充dp数组,最后判断结果是否有效。算法时间复杂度为O(amount*n),空间复杂度为O(amount)。原创 2025-10-24 09:05:54 · 665 阅读 · 0 评论 -
【Leetcode hot 100】198.打家劫舍
本文介绍了LeetCode 198题"打家劫舍"的两种动态规划解法。基础版使用O(n)空间存储中间结果,状态转移方程为dp[i] = max(dp[i-1], dp[i-2] + nums[i])。优化版通过两个变量prev和curr替代数组,将空间复杂度降至O(1)。两种方法时间复杂度均为O(n),适用于不同场景:基础版便于理解,优化版更适合实际应用。边界情况处理了空数组和单/双元素数组的特殊情况。原创 2025-10-23 11:04:42 · 306 阅读 · 0 评论 -
【Leetcode hot 100】279.完全平方数
本题要求用最少数量的完全平方数之和表示整数n。提供了三种解法:动态规划(O(n√n)时间,O(n)空间,基础解法)、BFS(O(n)时间,O(n)空间,最短路径思想)和数学方法(O(√n)时间,O(1)空间,基于四平方和定理)。推荐:小规模用动态规划理解原理,大规模优先数学解法。原创 2025-10-22 09:10:13 · 992 阅读 · 0 评论 -
【Leetcode hot 100】118.杨辉三角
杨辉三角是一个经典的数学结构,每个数字是它上方两个数字之和。本文给出了一种Java解法,通过逐行构建杨辉三角:首尾元素为1,中间元素由上一行对应位置的元素相加得到。算法时间复杂度为O(n²),空间复杂度为O(n²)。代码包含边界处理,并通过示例验证正确性,适用于生成指定行数的杨辉三角。原创 2025-10-21 11:41:45 · 342 阅读 · 0 评论 -
【Leetcode hot 100】70.爬楼梯
本文介绍了LeetCode爬楼梯问题的三种解法。基础动态规划解法使用dp数组存储每层的方法数,空间复杂度O(n);优化解法通过滚动变量将空间复杂度降至O(1),是面试推荐的最优解;数学公式法利用斐波那契数列通项公式实现O(1)时空复杂度,但存在精度问题。三种方法各具特点,实际应用中建议优先选择空间优化版的动态规划解法。原创 2025-10-20 19:14:41 · 805 阅读 · 0 评论 -
【Leetcode hot 100】763.划分字母区间
该问题要求将字符串划分为尽可能多的片段,确保每个字符仅出现在一个片段中。通过贪心算法和双指针策略解决:首先记录每个字符的最后出现位置,然后遍历字符串,动态扩展当前片段的边界,确保包含所有字符的出现。当遍历到边界时,记录片段长度并开启新片段。时间复杂度为O(n),空间复杂度为O(1)。该方法高效且直观,适用于字符串分割问题。原创 2025-10-18 22:55:18 · 786 阅读 · 0 评论 -
【Leetcode hot 100】45.跳跃游戏Ⅱ
摘要 题目要求在保证可达终点的前提下,找到从数组起点到终点的最小跳跃次数。提供两种解法: 贪心算法(最优解):通过维护当前跳跃边界(currentEnd)和能到达的最远位置(farthest),每次到达边界时更新跳跃次数,时间复杂度O(n),空间O(1)。 动态规划:逆序推导dp[i](从位置i到终点的最小跳跃次数),需遍历每个位置的可达范围,时间复杂度O(n²),空间O(n),适合辅助理解。 贪心算法效率更高,推荐使用;动态规划虽直观但效率较低,适用于小规模数据。原创 2025-10-17 21:43:54 · 775 阅读 · 0 评论 -
【Leetcode hot 100】394.字符串解码
摘要:本文探讨了LeetCode 394题“字符串解码”的两种解决方案。通过辅助栈法(最优解)和递归法,处理嵌套编码字符串的重复解码问题。辅助栈法利用数字栈和字符串栈分别维护重复次数和待拼接字符串,时间复杂度O(n),空间复杂度O(n)。递归法则通过分解嵌套子问题,同样实现O(n)的时间复杂度。两种方法均通过示例验证,如输入"3[a2[c]]"时,辅助栈法通过压栈/弹栈操作得到"accaccacc",递归法通过逐层解析实现相同结果。代码实现清晰展示了字符分类处理逻辑,原创 2025-10-16 11:08:22 · 754 阅读 · 0 评论 -
【Leetcode hot 100】155.最小栈
本文介绍了两种实现最小栈的O(1)时间复杂度解法:双栈法和链表法。双栈法使用数据栈和最小栈同步操作,实时维护最小值;链表法通过自定义节点存储当前值和栈内最小值。两种方法均满足题目要求,双栈法更直观适合快速实现,链表法则空间效率更高。文章包含详细代码实现和复杂度分析,并对比了两种方案的优缺点,最后提醒了边界值处理等注意事项。原创 2025-10-15 09:18:53 · 754 阅读 · 0 评论 -
【Leetcode Hot 100】20.有效的括号
摘要 本题要求判断仅含括号的字符串是否有效。有效条件包括:相同类型括号正确闭合、顺序正确且左右括号匹配。最优解法利用栈的先进后出特性,当遇到左括号时压入对应右括号,遇到右括号时检查栈顶是否匹配。时间复杂度O(n),空间复杂度O(n)。需注意处理奇数长度字符串、栈空情况及最终栈是否为空等边界条件。Java实现推荐使用Deque替代过时的Stack类,通过预处理和简化比较逻辑提升代码效率。典型测试案例覆盖了嵌套、顺序错误及单边括号等情况。原创 2025-10-14 13:45:00 · 2026 阅读 · 0 评论 -
【Leetcode hot 100】4.寻找两个正序数组的中位数
摘要: 题目要求在两个有序数组中找到中位数,要求时间复杂度为O(log(m+n))。核心思路是将问题转化为寻找第k小元素,利用二分法逐步缩小范围:比较两数组的第k/2个元素,淘汰较小值所在数组的前半部分,递归直至k=1或数组遍历完。通过计算总长度的奇偶性确定中位数位置,若总长为奇数取中间值,偶数取中间两数平均值。Java实现中,主函数计算目标位置后调用辅助函数获取第k小元素,再求平均。算法时间复杂度和空间复杂度均为对数级别,通过二分策略高效解决问题。原创 2025-10-13 21:58:23 · 652 阅读 · 0 评论 -
【Leetcode hot 100】33.搜索旋转排序数组
摘要: 该问题要求在旋转后的升序数组中(如 [4,5,6,7,0,1,2])高效查找目标值。通过二分查找,利用旋转数组的特性(至少有一半始终有序),每次判断目标位于有序段或无序段,逐步缩小搜索范围。核心步骤:若中间值等于目标则返回;否则根据左右段的有序性调整边界。算法时间复杂度为 O(log n),空间复杂度 O(1),满足题目要求。原创 2025-10-12 22:39:51 · 332 阅读 · 0 评论 -
【Leetcode hot 100】34.在排序数组中查找第一个和最后一个位置
这道题目要求在有序数组中查找目标值的起始和结束位置,时间复杂度需为O(log n)。通过两次二分查找分别定位左边界和右边界:第一次查找左边界时,当中间值等于目标值时继续向左收缩;第二次查找右边界时,当中间值等于目标值时继续向右收缩。最后校验边界合法性,若左边界无效则直接返回[-1, -1]。该方法高效且满足时间复杂度的要求。原创 2025-10-11 09:24:14 · 325 阅读 · 0 评论 -
【Leetcode hot 100】74.搜索二维矩阵
该问题要求在满足特定有序条件的二维矩阵中高效查找目标值。解法一利用二分查找,将矩阵视为扁平化的一维数组,通过坐标转换实现对数级时间复杂度O(log(mn)),空间复杂度O(1)。解法二采用边角切入法,从右上角开始逐步排除行列,时间复杂度O(m+n),但更直观易懂。两种方法均能正确处理边界情况,如目标值超出矩阵范围或矩阵为1x1。实际应用中,大规模矩阵优选二分查找,小矩阵或追求代码简洁时可考虑边角法。原创 2025-10-10 11:24:18 · 635 阅读 · 0 评论 -
【Leetcode hot 100】35.搜索插入位置
该问题要求在有序数组中查找目标值的插入位置,使用二分查找实现O(log n)时间复杂度。两种区间定义方法:1)左闭右闭区间[left,right],循环条件为left<=right,未找到时返回right+1;2)左闭右开区间[left,right),循环条件为left<right,未找到时返回left。两种方法都能正确处理目标值存在或不存在的情况,通过维护循环不变量确保正确性。关键点在于初始化边界、循环条件和指针更新的统一性,避免死循环或遗漏元素。原创 2025-10-09 15:14:52 · 482 阅读 · 0 评论 -
【Leetcode hot 100】51.N皇后
摘要: N皇后问题要求在n×n棋盘上放置n个皇后,使其互不攻击(同行、同列、同斜线)。本文通过回溯法解决该问题:逐行尝试放置皇后,确保当前位置合法(无同列及同斜线冲突),递归处理下一行,成功放置后记录解并回溯。Java代码实现中,使用char[][]表示棋盘,通过isValid快速校验合法性,最终转换为List<String>格式输出。时间复杂度为O(n!*n),空间复杂度为O(n²),适用于n≤9的约束条件。原创 2025-10-06 19:10:42 · 956 阅读 · 0 评论 -
【Leetcode hot 100】131.分割回文串
摘要 题目要求将字符串分割为所有可能的回文子串组合。解法一采用回溯框架,通过双指针实时判断子串是否为回文,时间复杂度较高。解法二优化为动态规划预处理,构建dp[i][j]数组标记所有子串的回文状态,将回文判断时间降至O(1)。两种方法均需遍历所有分割方案(O(2ⁿ)),但预处理使解法二整体效率更优。空间方面,解法二需额外O(n²)存储DP表。适用于字符串长度≤16的场景,确保时间复杂度可接受。原创 2025-10-05 22:41:59 · 463 阅读 · 0 评论
分享