自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 三种方法解开——力扣3370.仅含置位位的最小整数

题目简述 给定一个正整数 n,求满足以下条件的最小整数 x: x >= n x 的二进制表示全为1(如1, 3, 7, 15等) 解法思路 枚举法:从 k=1 开始,计算 (1 << k) - 1(即形如 2^k - 1 的数),直到结果不小于 n 为止。 数学推导:通过 k = ceil(log2(n + 1)) 直接计算 k,再得到结果 (1 << k) - 1(需注意浮点误差)。 代码实现 推荐写法:使用位运算枚举(时间复杂度O(1),最多循环10次)。 通用写法:支持大

2025-10-29 23:58:17 969

原创 面试必考的最简单逻辑题——力扣412.Fizz Buzz

题目要求对1到n的每个数字按特定规则转换为字符串:3的倍数输出"Fizz",5的倍数输出"Buzz",同时是3和5的倍数输出"FizzBuzz",否则输出数字本身。通过遍历1到n,使用条件判断依次处理这些情况即可。Java实现时需要注意判断顺序,先检查3和5的共同倍数。时间复杂度O(n),空间复杂度O(1)。该题考察基础循环和条件判断能力,通过字符串拼接可以优化代码结构。

2025-10-28 22:46:19 400

原创 O(1) 时间获取最小值的巧妙设计——力扣155.最小栈

LeetCode 155题要求设计一个支持O(1)时间获取最小值的栈。本文介绍了三种实现方法:1)双栈法,使用主栈和辅助栈同步记录最小值,推荐使用;2)单栈+辅助变量法,通过压栈时保存旧最小值来优化空间;3)链表节点法,每个节点存储当前最小值。三种方法时间复杂度均为O(1),双栈法最直观,单栈法节省空间,链表法灵活但不常用。核心思想是在操作时同步维护最小值状态,确保getMin()高效执行。

2025-10-27 23:14:31 993

原创 洗牌算法讲解——力扣384.打乱数组

本文介绍了 LeetCode 384 题「打乱数组」的 Java 解法,重点讲解了 Fisher-Yates 洗牌算法。该算法通过从后向前遍历数组,每次随机交换当前位置与前面任意位置的元素,确保所有排列出现的概率相等。文章包含题目描述、示例、算法原理、代码实现(含交换操作)、执行流程演示和复杂度分析,并对比了常见错误做法。该解法时间复杂度 O(n),空间复杂度 O(1),是处理数组随机排列问题的经典方法。

2025-10-26 20:27:50 964

原创 动态规划详细题解——力扣198.打家劫舍

本文介绍了LeetCode 198题"打家劫舍"的动态规划解法。题目要求在不触发相邻房屋警报的情况下,计算能偷取的最大金额。解题思路是建立状态转移方程dp[i] = max(dp[i-1], dp[i-2] + nums[i]),表示偷或不偷当前房屋的两种选择。文章提供了完整的Java实现代码,并进一步优化空间复杂度至O(1)。通过示例推导展示计算过程,最后还提到了该问题的系列扩展题目。这道题是理解动态规划思想的经典案例。

2025-10-25 21:14:59 1254

原创 动态规划or分治法——力扣53.最大子数组和

本文介绍了LeetCode 53题"最大子数组和"的两种解法。动态规划解法(Kadane算法)通过维护当前子数组和与全局最大值,在O(n)时间复杂度和O(1)空间复杂度内解决问题。分治法则将问题递归分解为左右子问题和跨越中点的子问题,时间复杂度为O(n log n)。文章通过示例详细解释了动态规划的执行过程,并对比了两种方法的优缺点。该问题是理解区间连续最优问题的经典案例,Kadane算法是解决类似问题的重要基础。

2025-10-24 22:31:34 840

原创 一次遍历——力扣121.买卖股票的最佳时机

本文解析了力扣121题「买卖股票的最佳时机」,要求在给定股票价格数组中找到买入和卖出时机以获得最大利润。核心思路是通过一次遍历动态维护历史最低价和最大利润,时间复杂度O(n),空间O(1)。文章详细说明了算法步骤、代码实现(Java)、复杂度分析,并提供了动态规划视角的扩展思考。同时指出了常见错误和注意事项,最后推荐掌握该解法以应对更复杂的股票交易变体问题。

2025-10-23 23:17:18 678

原创 五种解法搞定爬楼梯问题——力扣.爬楼梯

本文详细解析了LeetCode 70题"爬楼梯"的多种解法。题目要求计算爬到n阶楼梯的不同方法数,每次可爬1或2阶。核心思路是发现递推关系f(n)=f(n-1)+f(n-2),即斐波那契数列问题。文章从最基础的递归解法开始,逐步优化到记忆化递归、动态规划、空间优化(滚动数组)和数学公式解法,并对比了各方法的时间/空间复杂度。最终推荐使用O(1)空间的滚动数组解法,兼顾效率与简洁性。该问题是动态规划的经典入门题,掌握其思想对解决类似问题至关重要。

2025-10-22 23:43:49 1218

原创 一次学会二分法——力扣278.第一个错误的版本

本文详解了力扣278题「第一个错误的版本」的多种解法,重点分析了标准二分查找(迭代和递归)、半开区间二分、指数跳跃+二分等方法。标准二分查找的时间复杂度为O(log n),空间复杂度O(1),是最优解法。文章还讨论了整型溢出、区间边界等常见陷阱,并提供了代码实现和复杂度对比表格,推荐使用标准闭区间或半开区间二分法。对于特殊场景,指数跳跃+二分法可进一步优化调用次数。

2025-10-21 23:06:39 677

原创 从暴力到最优——力扣88.合并两个有序数组

本文介绍了合并两个有序数组的三种方法: 直接合并+排序:简单但效率低(O((m+n)log(m+n))) 双指针正序:需要额外数组(O(m+n)空间) 双指针逆序:最优解,从后往前合并,避免元素覆盖(O(m+n)时间,O(1)空间) 关键技巧是利用数组有序性,从尾部开始合并。第三种方法既高效又节省空间,是经典解法。

2025-10-20 23:38:41 1134

原创 中点为根——力扣108.讲有序数组转换为二叉搜索树

将有序数组转换为高度平衡的二叉搜索树,关键在于利用分治思想。通过选取数组中间元素作为根节点,递归构建左右子树,可以同时满足BST的有序性和平衡性要求。递归实现简洁高效,时间复杂度O(n),空间复杂度O(log n)。核心代码只需取中点、建节点、递归左右区间三步。迭代法也可实现,但复杂度略高。本题体现了分治算法在树结构构建中的典型应用。

2025-10-19 21:56:37 536

原创 BFS 与 DFS——力扣102.二叉树的层序遍历

本文介绍了力扣102题「二叉树的层序遍历」的两种解法:BFS(队列实现)和DFS(递归实现)。BFS利用队列逐层扫描节点,时间复杂度O(n),空间复杂度O(n);DFS通过递归记录层数信息,时间复杂度O(n),空间复杂度O(h)。两种方法各有特点,BFS直观易理解,DFS适合熟悉递归的开发者。文章还对比了两种方法的优劣,并提供了代码实现和复杂度分析,最后讨论了层序遍历的变体问题及其在面试中的应用场景。掌握层序遍历思想是理解BFS算法的关键基础。

2025-10-18 23:33:50 996

原创 递归与迭代——力扣101.对称二叉树

本文解析了力扣101题「对称二叉树」的两种解法。题目要求判断二叉树是否轴对称,关键在于比较左右子树是否互为镜像。递归法通过定义辅助函数isMirror,递归比较左右子树;迭代法则利用队列,按镜像顺序成对比较节点。两种方法的时间复杂度均为O(n),递归法空间复杂度O(h),迭代法为O(n)。递归法简洁直观,迭代法面试友好,可根据场景选择。本题考察了对二叉树遍历和镜像特性的理解。

2025-10-17 22:47:54 905

原创 三种思路彻底掌握 BST 判断(递归与迭代全解析)——力扣98.验证二叉搜索树

摘要: 本文全面解析力扣98题「验证二叉搜索树」,提出三种解法:1)递归区间法通过动态维护节点值的上下界验证;2)中序递归法利用BST中序遍历严格递增的特性;3)迭代中序法用显式栈模拟中序过程。三种方法均达到O(n)时间复杂度,但各有优劣:区间法通用性强,中序递归最简洁,迭代法适合面试。文中通过图示、代码和复杂度分析对比方案,并延伸至BST相关问题的解决思路。

2025-10-16 23:26:31 993

原创 从递归到迭代吃透树的层次——力扣104.二叉树的最大深度

本文介绍了三种求解二叉树最大深度的算法:1)递归法通过比较左右子树深度加1求解;2)BFS层序遍历通过队列逐层计数;3)显式栈DFS用栈模拟递归过程。递归法代码简洁但空间复杂度与树高相关;BFS直观但空间消耗较大;显式栈DFS灵活性高但实现稍复杂。三种方法时间复杂度均为O(n),适用于不同场景,可根据需求选择。

2025-10-15 23:45:28 543

原创 彻底搞懂快慢指针——力扣142.环形链表II

这篇文章详细解析了LeetCode 142题「环形链表II」的两种解法。首先通过哈希表法直观记录访问节点,空间复杂度O(n);更优解是快慢指针法(Floyd算法),利用数学推导在O(1)空间内定位环入口:当快慢指针相遇后,将其中一个指针移回头部,两者同步前进再次相遇点即为环起点。文章通过公式推导a=(n-1)r+(r-b)阐明原理,并对比两种方法,推荐掌握优雅的快慢指针解法。该题体现了算法从暴力到优化的思维跃迁,是理解链表双指针技巧的经典案例。

2025-10-14 22:52:24 1234

原创 别让链表兜圈子——力扣141.环形链表

给你一个链表的头节点head,判断该链表中是否存在环。如果存在一个节点,可以通过连续跟踪next指针再次到达自身,那么说明链表存在环。输入:head = [3,2,0,-4], pos = 1输出:true (尾部连接到第二个节点)方法思想时间复杂度空间复杂度特点哈希表法记录访问节点O(n)O(n)简单易懂快慢指针法龟兔赛跑O(n)O(1)高效优雅修改节点标记法改值标记O(n)O(1)破坏结构,不推荐。

2025-10-14 22:41:37 916

原创 三种解法(数组、栈、快慢指针)全面解析——力扣234.回文链表全解析

本文解析了力扣234题“回文链表”的三种解法:1)转为数组后双指针比较(O(n)时间/空间);2)利用栈辅助比较(O(n)时间/空间);3)快慢指针+反转链表(O(n)时间,O(1)空间)。前两种方法思路直观但占用额外空间,第三种方法通过反转后半部分链表实现最优空间复杂度。核心在于理解链表结构的对称性,快慢指针法通过找到中点并反转后半段进行高效比较,是工程实践中的推荐解法。不同方法在时间/空间复杂度上各有取舍,选择取决于具体场景需求。

2025-10-13 23:22:12 606

原创 三种方法解——力扣206.反转链表

本文详细解析了LeetCode 206.反转链表的三种解法:迭代法、递归法和栈法。迭代法通过双指针原地反转链表,时空复杂度最优;递归法代码简洁但空间复杂度较高;栈法逻辑直观但需要额外空间。三种方法各有特点,核心都在于改变节点指针方向,其中迭代法是最常用且高效的解法,适合面试和实际应用。文章通过图示和代码示例,清晰展示了每种解法的实现思路和操作步骤。

2025-10-12 22:59:50 453

原创 从递归到迭代的全方位解析——力扣38.外观数列(Count and Say)

本文详细解析了LeetCode 38题“外观数列”的解题思路与实现方法。文章首先介绍了题目定义和行程长度编码的规则,随后提供了三种解法:递归实现、迭代实现(推荐)和字符数组优化高性能版。通过Java代码示例和复杂度分析,对比了不同方法的优缺点,建议优先使用迭代法实现。文章还包含运行示例和总结表格,帮助读者快速掌握该问题的核心解法。适合算法学习者和面试准备者参考。

2025-10-11 23:22:08 1144

原创 从暴力到滑动窗口全解析——力扣8. 字符串转换整数 (atoi)

忘记处理前导空格:直接从首字符开始解析会出错。未考虑正负号:导致结果符号错误。数字越界未判断:会导致运行时错误或结果错误。读取数字后未停止:可能误解析额外字符。严格按照题意模拟整个转换过程,并在每一步都处理边界情况。通过实现myAtoi,我们不仅锻炼了对字符串处理的熟悉度,也提升了对“溢出控制”与“边界检测”的编程敏感性。掌握这题之后,对类似的字符串解析类问题(如字符串转浮点数、表达式计算等)会更加得心应手。

2025-10-10 23:44:54 971

原创 简单题——力扣387.字符串中的第一个唯一字符

方法思路时间复杂度空间复杂度适用场景方法一数组计数O(n)O(1)最推荐(仅小写字母)方法二HashMap 计数O(n)O(n)任意字符情况方法三字符 API 判断O(n²)O(1)简短字符串或快速实现。

2025-10-09 23:10:24 971

原创 二项式定理——力扣2221.数组的三角和

模拟法:代码简单直观,时间复杂度 O(n^2)。在n <= 1000的范围内可接受。数学优化:利用组合数公式,将最终结果转化为加权和,时间复杂度 O(n)。更高效。

2025-09-30 21:43:35 576

原创 多解法详解与边界处理——力扣7.整数反转

本文解析了LeetCode整数反转问题的两种解法:逐位反转法和字符串反转法。逐位反转法通过数学运算实现数字反转,并实时检查32位整数溢出,时间复杂度O(log n),空间复杂度O(1),是推荐解法。字符串法虽直观但性能较差。关键点在于正确判断正负数的溢出条件,面试中应优先展示逐位反转的优化解法,同时清晰解释边界处理逻辑。

2025-09-29 23:02:14 462

原创 位运算的高效实现(含多种解法对比)——力扣36.有效的数组

本文介绍了验证数独有效性的三种实现方法:布尔数组、HashSet和位运算。重点讲解了位运算的高效实现原理,通过9位二进制掩码记录数字出现状态,利用位操作快速检测重复。三种方法的时间复杂度均为O(1),空间复杂度为常数级。布尔数组法清晰易读,HashSet实现直观,位运算在内存和性能上更优。实际应用中可根据需求选择:追求可读性用布尔数组或HashSet,展示技巧性用位运算。文末提供了测试用例供验证。

2025-09-28 09:00:00 747

原创 力扣350.两个数组的交集II

很小),建议对更小的数组建立哈希表(或计数表),然后遍历较大的数组进行查找。(仅适用于值域小或允许小概率误判的场景):如果值域非常小,可以用位图;,以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应当等于该元素在两个数组中出现次数的较小值。,当某元素在哈希表中计数 > 0 时,将该元素加入结果并将计数减 1。(比如分块读取),对每块中的元素与哈希表匹配并记录结果,写出或累积结果。表明值域较小,可以直接用长度为 1001 的计数数组统计出现次数,比。,i++,否则 j++。这是经典的归并式扫描。

2025-09-27 11:36:56 441

原创 数组模拟加法——力扣66.加一

本文介绍了力扣第66题"加一"的三种解法。题目要求对一个大整数数组进行加一操作,重点在于处理进位问题。最优解是模拟进位法(方法一),时间复杂度O(n),空间复杂度O(1);方法二使用大数库虽然直观但效率低;方法三采用递归思路但不够高效。文章通过对比得出方法一为最佳实践,并提出了加k和减一等延伸思考。核心思路是从后向前处理进位,全9时需扩容数组。

2025-09-26 21:21:31 928

原创 神奇的位运算——力扣136.只出现一次的数字

摘要 题目要求在非空整数数组中找到只出现一次的数字(其他数字均出现两次)。常规HashSet解法(添加/移除元素)虽然直观,但空间复杂度为O(n)。最优解采用位运算异或(XOR),利用其性质:相同数异或为0,不同数异或保留原值。通过遍历数组将所有数字异或,最终结果即为只出现一次的数字,实现O(n)时间复杂度和O(1)空间复杂度。该方法简洁高效,是位运算的经典应用,还可扩展解决数字出现三次或两个唯一数字等变种问题。

2025-09-25 23:09:57 1174

原创 多种解法全解析——力扣217. 存在重复元素

这道题要求判断数组中是否存在重复元素。最直观的暴力解法使用双重循环比对,但时间复杂度高达O(n^2)。更高效的方法是先排序后检查相邻元素,时间复杂度降为O(n log n)。最优解是使用哈希集合,在遍历时检查元素是否已存在,时间空间复杂度均为O(n)。Java 8+还可用流式写法简洁实现。相比而言,哈希集合法在时间效率和可读性上表现最佳,是推荐的首选方案。

2025-09-25 00:04:00 855

原创 四种方法解决——力扣189.轮转数组

旋转数组问题解析与四种解法 本文详细介绍了 LeetCode 189 题「旋转数组」的四种解决方案: 暴力法(逐步右移):时间复杂度 O(n*k),空间 O(1),仅适合小数据量 额外数组法:借助临时数组存储结果,时间 O(n),空间 O(n) 翻转法(推荐):通过三次反转实现原地操作,时间 O(n),空间 O(1) 环状替换法:基于元素循环移动,时间 O(n),空间 O(1),实现较复杂 其中翻转法结合了时间空间效率与实现简洁性,是面试中最推荐的解法。文章提供了完整的 Java 实现代码和复杂度分析,帮助

2025-09-24 23:21:25 1182

原创 贪心 vs 动态规划——力扣122.买卖股票的最佳时机II

本文详解了LeetCode 122题"买卖股票的最佳时机II"的多种解法。贪心法通过累加正差实现O(n)时间;峰谷法直观捕捉上升段;动态规划用状态机建模,便于扩展。文章比较了各方法的复杂度,推荐面试时优先使用贪心,并补充状态机思路。附代码示例和复杂度分析,帮助读者掌握无限次交易下的最优解,为处理更复杂的变体问题(如手续费、冷却期)奠定基础。

2025-09-24 00:46:25 886

原创 交换 vs 覆盖——力扣283.移动零

本文介绍了力扣第283题"移动零"的三种解法:双指针交换法、双指针覆盖+补零法以及优化交换法。重点分析了每种方法的思路、优缺点及适用场景,推荐使用覆盖+补零法(方法二)作为最优解,因其代码简洁且性能稳定。三种方法的时间复杂度均为O(n),空间复杂度O(1),满足原地操作要求。核心在于利用双指针技巧,一个遍历数组,一个记录非零元素位置,在保持非零元素顺序的同时将零移动到数组末尾。

2025-09-23 09:36:27 1000

原创 双指针必学——力扣.26删除有序数组中的重复项

本文介绍了力扣第26题「删除有序数组中的重复项」的解题思路。题目要求原地删除重复元素并返回新长度,关键在于利用双指针技巧:快指针遍历数组,慢指针记录不重复元素的位置。该方法时间复杂度O(n),空间复杂度O(1)。文章还对比了暴力解法(不推荐)和双指针法(推荐),并提供了Java代码实现。这道题是数组和双指针的经典入门题,其解法可扩展至类似问题如「允许重复两次」或「删除特定元素」。核心思路是快指针探索,慢指针收集结果,适用于多种数组操作场景。

2025-09-22 23:35:01 662

原创 二分查找经典——力扣153.寻找旋转排序数组中的最小值

摘要: 力扣153题要求在旋转后的排序数组中寻找最小值,要求时间复杂度O(log n)。核心思路是利用二分查找,通过比较中间元素与右边界来缩小搜索范围:若中间值大于右边界,最小值在右半部分;否则在左半部分。代码实现简洁,最终返回左指针指向的值即可。该问题考察二分查找的灵活应用,是面试常见题型。掌握此方法可解决类似旋转数组问题。

2025-09-22 23:17:43 903

原创 从暴力到优雅实现——力扣557.反转字符串中的单词 III

本文介绍了三种Java方法反转字符串中的每个单词:1)使用split和reverse方法,简单直接但空间复杂度较高;2)双指针原地反转,性能最优且空间复杂度为O(1);3)栈辅助方法,思路清晰适合初学者。推荐使用双指针方法,通过遍历字符数组,在单词范围内交换字符实现原地反转。三种方法时间复杂度均为O(n),但双指针方法空间效率最高,是面试中最优解。

2025-09-21 12:15:00 632

原创 一维数组原地更新——力扣119.杨辉三角形II

本文介绍了三种Java方法求解杨辉三角指定行,满足不同的时间/空间复杂度要求。方法一(O(k²)空间)直接构建整个三角;方法二(O(k)空间)通过一维数组从后往前原地更新;方法三(O(1)空间)利用组合数公式实现最优解。推荐面试使用方法二,既满足进阶要求又易于理解,代码清晰。三种方法对比显示,方法二在时间/空间复杂度间取得平衡,是面试的理想选择。

2025-09-20 13:00:00 610

原创 Java全解法——力扣118.杨辉三角

本文总结了LeetCode 118题“杨辉三角”的多种Java解法,包括逐行构造、保留上一行、一维数组优化和组合数公式四种方法。文章分析了各解法的时间复杂度(均为O(n²))和空间优化策略,并给出了面试建议:优先选择直观的逐行构造法,组合数公式适合数学拓展。关键点包括更新顺序、数据类型选择和边界处理。扩展思考提出了流式生成和大数取余等优化方向。全文提供了完整的可运行代码,适合面试准备和算法学习参考。

2025-09-19 00:30:49 1343

原创 滑动窗口法的优化与实战——力扣209.长度最小的子数组

题目要求找到总和≥target的最短连续子数组。初始滑动窗口代码存在窗口收缩不彻底的问题,优化后改为持续收缩确保找到最小窗口,时间复杂度O(n)。另提供前缀和+二分查找的O(n log n)解法,适用于需要二分优化的场景。暴力法因O(n²)复杂度不推荐。最优解是优化后的滑动窗口法,简洁高效。

2025-09-18 23:56:41 673

原创 从暴力到最优解的全面解析——力扣485.最大连续1的个数

本文探讨了力扣485题"最大连续1的个数"的多种解法。最推荐单次遍历计数法,通过维护当前连续1的计数和最大值,简洁高效。双指针法体现了滑动窗口思想,动态规划法可优化为O(1)空间。字符串分割法虽直观但不推荐。文章比较了各方法的时间/空间复杂度,指出常见错误和调试技巧,并建议首选单次遍历法。该问题的核心思想(遇到0重置,遇到1累加)为更复杂的数组问题奠定了基础。

2025-09-17 23:32:24 1064

原创 双指针法:O(n)时间常量空间——力扣167.两数之和II - 输入有序数组

摘要:力扣167题要求在一个有序数组中找到两数之和等于目标值,返回其1-based下标。推荐双指针法:初始化左右指针分别指向数组两端,通过比较当前和与目标值动态调整指针位置,时间复杂度O(n),空间复杂度O(1)。备选二分查找法对每个元素在其右侧二分查找补数,时间复杂度O(n log n)。双指针法更优,充分利用数组有序性,代码简洁高效。注意下标转换和指针移动逻辑即可避免常见错误。

2025-09-16 23:51:07 927

空空如也

空空如也

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

TA关注的人

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