自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法题 相交链表

本文介绍了三种方法解决链表相交问题:1. 双指针法:通过交替遍历两个链表找到相交节点,时间复杂度O(m+n),空间O(1),是最优解;2. 哈希集合法:先存储一个链表节点,再遍历另一个链表查找,时间O(m+n),空间O(m);3. 长度对齐法:先计算链表长度差,再同步遍历,时间O(m+n),空间O(1)。双指针法因其空间效率高且代码简洁被推荐为最佳解决方案。

2025-10-21 16:49:46 801

原创 算法题 逆波兰表达式求值

本文介绍了逆波兰表达式(后缀表达式)的求值方法。通过使用栈数据结构,可以高效地计算表达式的值。算法遍历表达式元素,遇到数字压栈,遇到运算符则弹出两个操作数进行运算并将结果压回栈中。提供了两种实现:使用Stack类和数组模拟栈,后者性能更优。时间复杂度O(n),空间复杂度O(n)。示例演示了算法执行过程,如输入["2","1","+","3","*"]得到9,符合((2+1)*3)的结果。

2025-10-21 16:32:56 548

原创 算法题 对链表进行插入排序

本文介绍了链表的插入排序算法。算法通过维护已排序和未排序两部分链表,逐个将未排序节点插入到已排序部分的正确位置。关键点包括:创建虚拟头节点简化边界处理、利用指针操作实现节点插入、对有序部分进行优化检查。文章提供了两种实现方式:标准版(带提前终止优化)和简化版(每次都从头查找),分析了时间复杂度(最好O(n),最坏O(n²))和空间复杂度(O(1))。通过示例演示了排序过程,并附上了测试用例验证方法。该算法适合小规模或接近有序的链表排序。

2025-10-21 16:14:48 475

原创 算法题 二叉树的后序遍历

本文介绍了二叉树后序遍历的多种实现方法。后序遍历顺序为左子树→右子树→根节点。提供了四种解决方案:1) 递归法,直接按定义实现;2) 迭代法使用标记记录访问状态;3) 迭代法通过前驱节点判断右子树是否已访问;4) 逆序法先按"根→右→左"遍历再反转结果。递归法简单直观,而迭代法则需要处理更复杂的访问顺序控制。每种方法都附有详细注释的Java代码实现,适合不同场景下的应用。

2025-10-20 16:01:00 398

原创 算法题 二叉树的前序遍历

本文介绍了二叉树前序遍历的四种实现方法:递归、迭代、Morris遍历和统一迭代。前序遍历顺序为根节点→左子树→右子树。递归法直接按照定义实现,代码简洁;迭代法使用栈模拟递归过程;Morris遍历通过临时修改树结构实现O(1)空间复杂度;统一迭代法通过标记节点统一了前中后序遍历的实现模板。每种方法都提供了Java代码示例,适用于不同场景的需求。

2025-10-20 15:32:04 612

原创 算法题 重排链表

本文介绍了重排链表的三种解法,核心目标是将链表从L0→L1→...→Ln变为L0→Ln→L1→Ln-1→...的交替形式。最优解法是三步法:1)用快慢指针找到中点;2)反转后半部分;3)交替合并两部分,时间复杂度O(n),空间复杂度O(1)。栈方法利用栈存储后半节点,空间复杂度O(n);递归方法每次处理头尾节点,时间复杂度O(n²)。三种方法均需实际交换节点而非仅修改值。

2025-10-20 15:07:16 360

原创 算法题 加油站

这篇文章介绍了加油站环路问题及其解决方案。问题要求在环形道路上找到能够完成一周行驶的起始加油站,条件是总加油量不小于总耗油量。文章提出了两种算法:暴力法(O(n²))和贪心算法(O(n))。贪心算法通过一次遍历计算总剩余油量和当前剩余油量,当总剩余油量为非负时确定起点。算法正确性基于总油量条件和局部最优性原理。文章包含Java代码实现、算法分析、示例验证和测试用例,清晰地展示了问题解决思路和具体实现方法。

2025-10-17 16:09:18 716

原创 算法题 克隆图

本文介绍了克隆无向连通图的算法,重点处理了环结构和重复节点问题。通过哈希表建立原节点到克隆节点的映射,避免重复克隆。提供了两种实现方法:1) DFS递归:简洁清晰,通过递归克隆所有邻居;2) BFS迭代:使用队列逐层处理节点,先创建所有节点再建立邻居关系。两种方法时间复杂度均为O(N+M),空间复杂度O(N),能正确处理各种图结构。DFS适合大多数情况,BFS可避免递归栈溢出。文章包含完整Java代码实现和详细算法分析。

2025-10-17 15:46:27 678

原创 算法题 求根节点到叶节点数字之和

本文介绍了计算二叉树根节点到所有叶节点路径数字之和的三种方法:递归DFS、迭代DFS和BFS。通过深度优先遍历构建路径数字,遇到叶节点时累加。三种方法时间复杂度均为O(n),空间复杂度取决于树的结构(O(h)或O(w))。递归DFS简洁高效,迭代DFS避免递归栈溢出,BFS按层处理适合宽度大的树。适用于需要沿路径构建数字的二叉树问题。

2025-10-17 15:19:36 585

原创 算法题 杨辉三角 II

本文介绍了生成杨辉三角指定行的高效算法,重点解决如何在O(rowIndex)空间复杂度下完成任务。提供了三种实现方法:1)一维动态规划,通过从后往前更新避免数据覆盖;2)组合数公式法,利用数学性质直接计算元素;3)优化的一维DP,动态构建列表。三种方法时间复杂度均为O(rowIndex²),空间复杂度O(rowIndex),其中组合数公式法最为简洁但需注意整数溢出问题。测试案例验证了算法正确性及对称性,关键点在于动态规划实现时的从后往前更新策略。

2025-10-16 16:50:13 866

原创 算法题 杨辉三角

摘要: 杨辉三角生成算法利用动态规划思想,通过递推关系构建每行元素。核心思路是每行首尾为1,中间元素等于上一行相邻两数之和。标准解法按行生成并存储,时间复杂度O(n²),空间复杂度O(n²)。优化解法使用一维数组从后往前计算,但最终仍需转换为二维结构。算法适用于生成任意行数的杨辉三角,需注意边界条件和首尾元素的特殊处理。测试验证了不同行数下的正确性,包括单行、多行和零行情况。

2025-10-16 16:25:45 669

原创 算法题 填充每个节点的下一个右侧节点指针 II

LeetCode 117题要求在非完美二叉树中填充每个节点的next指针。提供了三种解法:层序遍历(BFS)方法简单直观;优化方法利用已建立的next指针实现O(1)空间复杂度;递归方法效率较低但展示了另一种思路。关键点在于处理不同层级的节点连接,特别是当子树不完整时如何跨子树建立连接。最优解法是空间优化方法,既保证了线性时间复杂度,又避免了额外空间消耗。

2025-10-16 16:03:09 719

原创 算法题 填充每个节点的下一个右侧节点指针

LeetCode 116:填充完美二叉树的下一个右侧节点指针 问题概述: 给定一个完美二叉树,要求填充每个节点的next指针,使其指向同层右侧节点,若不存在则置为null。 关键方法: 层序遍历(BFS):直观但需要O(n)空间 next指针利用:最优解(O(1)空间),利用已建立的next指针逐层连接子节点 递归法:简洁但存在O(log n)递归栈开销 最优解核心: 通过父节点的next指针建立跨父节点的子节点连接 示例:父节点2的右子节点5通过2.next连接3的左子节点6 复杂度: 时间复杂度:O(n

2025-10-15 16:37:01 895

原创 算法题 平衡二叉树

算法摘要:LeetCode 110题要求判断二叉树是否为高度平衡的(任意节点的左右子树高度差不超过1)。提供了三种解法:1)自顶向下递归法,通过递归计算每个节点的子树高度并进行平衡检查,但存在重复计算导致O(n²)时间复杂度;2)更优的自底向上递归法,在后序遍历中同时计算高度和检查平衡性,用-1标记不平衡情况,实现O(n)时间复杂度;3)迭代法使用栈和HashMap模拟后序遍历过程。其中方法二(自底向上递归)是最优解,兼顾效率(O(n))和代码简洁性。

2025-10-15 16:02:30 897

原创 算法题 从中序与后序遍历序列构造二叉树

LeetCode 106题要求根据中序和后序遍历序列构造二叉树。关键思路是利用后序遍历的最后一个元素为根节点特性,分割中序遍历序列为左右子树。最优解法采用递归+HashMap优化,存储中序序列的值索引映射,时间复杂度O(n)。需注意构造顺序应为先右子树后左子树,因为后序遍历从后往前处理时先遇到右子树根节点。迭代法也可通过栈实现,但递归更直观。该问题考察对二叉树遍历特性的理解和递归应用能力。

2025-10-15 10:36:30 1203

原创 算法题 二叉树的最大深度

本文介绍了LeetCode 104题"二叉树的最大深度"的三种解法:递归法(DFS)、迭代法(BFS层序遍历)和迭代法(DFS显式栈)。递归法通过比较左右子树深度取最大值加1实现;BFS法按层遍历计数;DFS迭代法使用栈模拟递归过程。三种方法时间复杂度均为O(n),空间复杂度分别为O(h)、O(w)和O(h)。文中提供了完整代码实现和示例分析,并比较了各方法的特点,递归法最简洁,BFS法直观,DFS迭代法避免栈溢出。

2025-10-15 09:59:18 599

原创 算法题 相同的树

本文介绍了LeetCode第100题"相同的树"的解法,通过递归和迭代两种方法判断两棵二叉树是否相同。递归法采用深度优先搜索(DFS),通过比较当前节点值和递归检查左右子树实现;迭代法则使用广度优先搜索(BFS)配合队列,或DFS配合栈实现。算法时间复杂度为O(min(m,n)),空间复杂度取决于树的高度/宽度。文中提供了三种代码实现(递归、BFS迭代、DFS迭代),并配有详细的算法分析和示例说明,帮助理解不同方法的核心思想和执行过程。

2025-10-15 09:40:28 794

原创 算法题 恢复二叉搜索树

摘要 LeetCode 99题要求恢复被错误交换了两个节点的二叉搜索树(BST)。关键点在于利用BST中序遍历的有序性:通过遍历检测异常节点对,分为相邻交换(1个异常对)和非相邻交换(2个异常对)两种情况。文中提供了三种解法:1) 中序遍历+数组存储(O(n)空间);2) 递归中序遍历+三个指针(O(h)空间);3) Morris遍历(O(1)空间,满足进阶要求)。核心步骤都是定位异常节点后交换其值,其中Morris遍历通过修改树结构实现无栈遍历,是最优解。

2025-10-14 16:34:52 966

原创 算法题 二叉树的中序遍历

本文介绍了二叉树中序遍历的三种实现方法:递归法、迭代法和Morris遍历。递归法通过系统调用栈实现,代码简洁;迭代法使用显式栈模拟递归过程;Morris遍历则利用线索化实现O(1)空间复杂度。三种方法时间复杂度均为O(n),空间复杂度分别为O(h)、O(h)和O(1)。文章详细分析了各方法的实现原理、代码示例和遍历过程,并通过示例[1,null,2,3]展示了具体执行步骤,最后提供了测试用例验证算法正确性。

2025-10-14 16:06:09 1135

原创 算法题 分隔链表

LeetCode 86题要求将链表按给定值x分隔,小于x的节点在前且保持原始相对顺序。解决方案采用双链表分离法:创建两个虚拟头节点分别存储小值和大值节点,遍历原链表时根据节点值连接到对应链表尾部,最后连接两个链表并断开尾部防止成环。算法时间复杂度O(n),空间复杂度O(1),通过一次遍历高效完成分隔,同时保持节点原始顺序。示例输入[1,4,3,2,5,2]经处理后输出[1,2,2,4,3,5]。该方法通过虚拟头节点简化边界处理,是处理链表分隔问题的经典方案。

2025-10-14 15:47:04 401

原创 算法题 删除排序链表中的重复元素 II

摘要 本文介绍了删除排序链表中所有重复节点(只保留不重复节点)的三种解法: 哨兵节点+双指针法:使用虚拟头节点处理边界情况,通过prev和curr指针遍历链表,遇到重复节点时跳过整段重复序列 一次遍历优化法:在单次遍历中同时检测和处理重复序列,代码更紧凑 递归法:通过递归处理子链表,遇到重复节点时跳过整段重复序列后递归处理剩余部分 三种方法的时间复杂度均为O(n),空间复杂度分别为O(1)(迭代法)和O(n)(递归法)。文中详细说明了算法流程并通过示例演示了处理过程,最后提供了测试用例验证算法正确性。

2025-10-13 16:04:16 1028

原创 算法题 删除排序链表中的重复元素

摘要:本文介绍了删除已排序链表中重复元素的算法,确保每个元素只出现一次。提供了三种实现方法:单指针迭代法(O(n)时间,O(1)空间)、递归法(简洁但O(n)空间)和双指针法(带哨兵节点)。详细展示了单指针迭代法的执行过程,并通过测试用例验证算法正确性。核心思路是利用链表有序性,通过指针比较相邻节点值来跳过重复元素。

2025-10-13 15:35:30 418

原创 算法题 x 的平方根

本文介绍了计算非负整数x的算术平方根(仅保留整数部分)的两种方法:二分查找法和牛顿迭代法。二分查找法通过搜索范围[0, x/2]找到满足条件的最大整数,时间复杂度O(log x)。牛顿迭代法利用迭代公式快速逼近平方根,收敛速度更快(O(log log x))。文章提供了Java实现代码,包括边界处理和避免溢出的技巧,并分析了算法过程和测试用例,展示了不同方法的性能特点和适用场景。

2025-10-01 10:20:19 898

原创 算法题 旋转链表

摘要: 旋转链表问题要求将链表每个节点向右移动k个位置。解决方法包括:1)计算链表长度并处理k值(k = k % length);2)找到新尾节点(第length-k个节点);3)断开重连链表。提供了三种实现方法:一次遍历法(推荐)、闭合为环法和双指针法,时间复杂度均为O(n),空间复杂度O(1)。示例显示,当输入[1,2,3,4,5]和k=2时,输出为[4,5,1,2,3]。关键点在于正确处理k值超过链表长度的情况,并准确定位断开位置。

2025-10-01 09:59:14 867

原创 算法题 排列序列

摘要: 本文介绍了解决"排列序列"问题的三种算法,目标是在1到n的数字集合中找到第k个字典序排列。数学方法通过阶乘分组定位每位数字,时间复杂度O(n²),是最优解;递归回溯法直观但效率低;优化数学法用位掩码替代列表操作。以n=4,k=9为例,数学方法计算各阶乘后逐步确定各位数字,高效得到结果"2314"。三种方法对比显示数学方法最适合大n值,而回溯法仅适用于极小规模问题。

2025-09-30 15:48:06 722

原创 算法题 螺旋矩阵 II

本文介绍了生成n×n螺旋矩阵的三种方法:边界收缩法、方向向量法和递归法。边界收缩法通过维护四个边界(top/bottom/left/right)逐步向内收缩填充;方向向量法利用方向数组控制填充路径;递归法则将问题分解为逐层填充边界再处理内层矩阵。所有方法的时间复杂度均为O(n²),需要填充n²个元素,每个元素只访问一次。示例代码提供了Java实现,适用于按顺时针顺序生成包含1到n²的螺旋矩阵。

2025-09-30 15:26:33 950

原创 算法题 插入区间

摘要: 本文介绍了在无重叠且有序的区间列表中插入新区间的算法。给定区间列表intervals和新区间newInterval,要求保持列表无重叠且有序。主要采用三段式处理:1) 将结束时间小于newInterval开始时间的区间直接加入结果;2) 合并所有与newInterval重叠的区间,取最小开始时间和最大结束时间;3) 将开始时间大于合并区间结束时间的剩余区间加入结果。提供了三种实现方法:一次遍历法(时间复杂度O(n))、先插入后合并法(O(n))和二分查找优化法(O(logn))。核心思路是通过判断区

2025-09-30 10:57:03 724

原创 算法题 Pow(x, n)

本文介绍了快速计算幂函数 pow(x, n) 的算法实现。主要采用快速幂的分治思想,通过递归或迭代方式将时间复杂度优化至 O(log n)。关键点包括:1) 利用幂运算性质分解问题;2) 处理负指数情况;3) 避免重复计算。提供了三种实现方法:递归法、迭代法和位运算优化法,其中递归法最直观,迭代法空间效率更高,位运算法性能最优。测试用例验证了算法正确性,包括正/负指数、小数底数等边界情况。该算法有效解决了大指数计算问题,适用于各类幂运算场景。

2025-09-30 10:27:14 601

原创 算法题 K 个一组翻转链表

本文介绍了两种解决"K个一组翻转链表"问题的算法:迭代法和递归法。迭代法通过虚拟头节点简化边界处理,使用getKth方法定位每组的尾节点,然后翻转并连接各组,空间复杂度O(1)。递归法则通过递归调用处理每组翻转,代码更简洁但需要O(n/k)的栈空间。两种方法的时间复杂度均为O(n),其中迭代法更符合进阶要求。文章详细说明了算法思路、实现代码和执行过程,并提供了测试用例验证正确性。

2025-09-29 10:57:10 491

原创 算法题 两两交换链表中的节点

摘要:本文介绍了交换链表中相邻节点的两种解法。迭代法使用虚拟头节点和指针维护,通过三步操作交换节点对,时间复杂度O(n),空间复杂度O(1)。递归法将问题分解为交换前两个节点后递归处理剩余部分,代码更简洁但空间复杂度为O(n)。两种方法都能正确处理空链表、单节点链表等边界情况,迭代法更适合处理长链表。测试验证了算法在标准输入和边界条件下的正确性。

2025-09-29 10:27:57 612

原创 算法题 分割平衡字符串

摘要 本文介绍了如何分割平衡字符串以获得最大数量的平衡子字符串。平衡字符串中'L'和'R'数量相同。采用贪心算法,使用计数器跟踪字符差异,当平衡时立即分割,确保局部最优即全局最优。提供了三种实现方法:计数器法(最优空间复杂度O(1))、栈方法和状态机方法,时间复杂度均为O(n)。通过示例展示了算法过程,并给出了多个测试用例验证算法正确性。

2025-09-27 10:03:09 890

原创 算法题 字符串的最大公因子

摘要:本文探讨了字符串的最大公因子问题,即找出能同时除尽两个给定字符串的最长公共子串。关键思路基于数学性质:当且仅当str1+str2 == str2+str1时存在公共因子。文中提供了三种解法:1) 数学方法通过验证字符串拼接结果并计算长度的最大公约数;2) 暴力枚举从最长可能子串开始检查;3) 递归方法模拟欧几里得算法。最优解为数学方法,时间复杂度O(m+n)。示例表明,如输入("ABCABC","ABC")输出"ABC",而("LE

2025-09-27 09:47:11 383

原创 算法题 删除字符串中的所有相邻重复项

本文介绍了使用栈、StringBuilder和双指针三种方法删除字符串中所有相邻重复项的问题。通过栈模拟和贪心策略,算法能在O(n)时间内完成操作。栈方法思路清晰,StringBuilder避免了栈的开销,双指针则实现了原地操作。示例展示了"abbaca"变为"ca"的过程,并提供了多种测试用例验证算法正确性。

2025-09-26 16:01:52 990

原创 算法题 删除最外层的括号

摘要 本文介绍了删除有效括号字符串最外层括号的算法问题。给定一个由多个有效括号组合而成的字符串,要求删除每个组合的最外层括号后返回结果。文章提出了三种解决方案:1) 计数器法:通过跟踪括号深度决定是否保留字符;2) 栈方法:利用栈结构识别嵌套层级;3) 分组处理法:先识别各个原始有效括号段再分别处理。三种方法时间复杂度均为O(n),其中计数器法空间效率最高(O(1))。通过示例"(()())(())"的逐步解析,展示了计数器法的执行过程,最终输出为"()()()"。

2025-09-26 15:38:13 622

原创 算法题 查找共用字符

本文介绍了查找字符串数组中所有公共字符(包括重复字符)的算法。核心思路是通过统计每个字符串的字符频次,取各字符在所有字符串中的最小出现次数作为结果。提供了三种实现方法:1) 使用频次数组,统计26个字母的最小频次;2) 使用HashMap的通用解法,适用于任意字符集;3) Java 8流式API函数式解法。这些方法都能高效解决问题,时间复杂度为O(n*m),其中n是字符串数量,m是字符串平均长度。

2025-09-26 11:02:20 1028

原创 算法题 长按键入

摘要:长按键入问题判断输入的字符串typed是否可能是名字name的长按版本(某些字符可能重复)。使用双指针法,比较两字符串的字符顺序和重复次数:typed中每个字符的重复次数必须≥name中的对应次数。提供三种解法:双指针逐字符比较(时间复杂度O(n+m))、简化双指针版本和正则表达式方法。典型示例如name="alex",typed="aaleex"返回true,因为'a'和'e'被长按。

2025-09-26 10:38:26 429

原创 算法题 仅仅反转字母

本文介绍了如何实现一个仅反转字符串中字母字符的算法。通过双指针法,从两端向中间遍历字符串,跳过非字母字符并交换字母字符的位置。还提供了使用栈的替代方法,但双指针法在空间效率上更优。算法时间复杂度为O(n),空间复杂度为O(n)。示例展示了从输入"a-bC-dEf-ghIj"到输出"j-Ih-gfE-dCba"的转换过程,验证了算法的正确性。

2025-09-25 16:13:53 841

原创 算法题 比较含退格的字符串

本文比较两个含退格字符#的字符串是否相等。问题描述给定两个字符串,#表示退格键,需判断处理后结果是否相同。提供了三种解决方法:1)使用栈模拟退格过程,构建最终字符串比较;2)双指针逆序遍历,空间优化到O(1);3)StringBuilder直接模拟退格操作。分析显示栈和StringBuilder方法时间复杂度O(M+N),空间复杂度O(M+N),而双指针方法空间优化至O(1)。三种方法核心思路都是正确处理退格操作,删除前一个有效字符,比较最终结果。

2025-09-25 15:06:37 717

原创 算法题 旋转字符串

判断两个字符串是否可以通过旋转操作相互转换的算法摘要: 核心思路:若goal是s的旋转结果,则goal必定是s+s的子字符串 关键步骤: 检查长度是否相同 拼接s+s并检查是否包含goal 三种实现方法: 字符串拼接法(最优推荐):O(n)时间,O(n)空间 暴力模拟法:O(n²)时间,O(n)空间 逐字符比较法:O(n²)时间,O(1)空间 边界处理: 空字符串情况 长度不等直接返回false 算法优势:字符串拼接法简洁高效,利用旋转字符串的数学特性

2025-09-25 10:41:28 855

原创 算法题 宝石与石头

本文介绍了统计字符串中宝石数量的算法问题,给出了三种解决方案:1)使用HashSet存储宝石类型,时间复杂度O(J+S);2)利用布尔数组优化空间至O(1);3)位运算极致优化空间。关键点在于利用不同数据结构高效统计字符出现次数,其中布尔数组法在已知ASCII字符集时性能最优,而HashSet通用性更强。所有方法都达到了线性时间复杂度,适用于不同场景需求。

2025-09-25 10:21:14 854

空空如也

空空如也

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

TA关注的人

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