自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法题 平方数之和

摘要 LeetCode 633题要求判断一个非负整数c是否可以表示为两个整数的平方和。本文介绍了四种解决方法:1)双指针法,在[0, √c]范围内寻找满足条件的a和b;2)暴力枚举法,逐个检查可能的a值;3)优化暴力法,利用a≤b的性质减少计算量;4)基于费马定理的数学方法,通过质因数分解判断。其中双指针法最为高效,时间复杂度为O(√c)。文章详细说明了每种方法的实现原理、代码示例和复杂度分析,并提供了多个测试用例验证算法正确性。

2025-11-21 16:40:07 391

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

摘要:本文介绍了LeetCode 590题N叉树后序遍历的四种解法。递归方法最直观,迭代法使用栈和访问标记,逆序前序法通过反转"根→右→左"遍历结果实现,LinkedList优化法在头部添加元素避免反转。所有方法时间复杂度均为O(n),空间复杂度与树高相关。示例展示了输入树结构及各方法的遍历过程,最终输出正确的后序序列[5,6,3,2,4,1]。

2025-11-21 16:23:21 528

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

LeetCode 589. N叉树前序遍历摘要 问题:实现N叉树的前序遍历(根→子节点从左到右)。 方法: 递归:先访问根节点,再递归遍历子节点 迭代:使用栈,逆序压入子节点确保弹出顺序正确 优化迭代:使用Deque或ListIterator简化代码 复杂度: 时间:O(n)(每个节点访问一次) 空间:O(h)(树高度,递归栈或栈空间) 示例: 输入[1,null,3,2,4,null,5,6] → 输出[1,3,5,6,2,4] 关键点:处理子节点顺序时需逆序压栈,确保弹出时按前序遍历顺序。

2025-11-21 16:12:28 441

原创 算法题 另一棵树的子树

LeetCode 572题要求判断一棵二叉树是否包含另一棵给定的子树。摘要如下: 问题描述:给定二叉树root和subRoot,判断root是否包含与subRoot完全相同的子树(结构和节点值)。 算法思路: 双重递归解法: 外层遍历主树每个节点 内层递归比较子树是否完全相同 序列化方法: 将两棵树序列化为字符串 检查主字符串是否包含子字符串 时间复杂度:双重递归O(m×n),序列化O(m+n) 空间复杂度:双重递归O(max(h1,h2)),序列化O(m+n) 关键点:子树必须完全匹配;正确处理空树情况;

2025-11-20 16:38:40 687

原创 算法题 二叉树的坡度

摘要 LeetCode 563题要求计算二叉树的坡度,定义为所有节点左子树和右子树节点值之和的绝对差的总和。本文提供了四种解决方案: 全局变量法:使用后序遍历,递归计算子树和,同时用全局变量累加坡度。时间复杂度O(n),空间复杂度O(h)。 返回数组法:每个递归调用返回子树和与坡度两个信息。同样O(n)时间复杂度。 两次遍历法:第一次计算每个节点的子树和,第二次基于子树和计算坡度。会修改原树结构。 面向对象法:使用类封装返回信息,清晰但稍显冗余。 核心思路都是后序遍历,关键点在于如何组织递归返回的信息。全局

2025-11-20 16:24:41 314

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

摘要: 本文介绍了LeetCode 559题(N叉树最大深度)的三种解法:递归、层序遍历和DFS迭代。递归解法通过计算所有子节点的最大深度后加1得到结果;层序遍历使用BFS统计层数;DFS迭代用栈模拟递归过程。时间复杂度均为O(n),空间复杂度根据方法不同分别为O(h)或O(w)。文中提供了完整的Java代码实现,包括示例树的详细计算过程和边界情况处理。

2025-11-20 16:06:21 346

原创 算法题 反转字符串 II

LeetCode 541题要求对字符串进行分段反转:给定字符串s和整数k,从开头每2k字符为一组,反转前k个字符。若剩余字符少于k个则全部反转,若在k到2k之间则反转前k个。例如输入"abcdefg"和k=2,输出"bacdfeg"。算法思路是每2k步长分段处理,反转前k个字符,注意边界条件。最优解法时间复杂度O(n),空间复杂度O(n),可用字符数组或StringBuilder实现。

2025-11-19 16:38:37 343

原创 算法题 零钱兑换 II

摘要 LeetCode 518题是经典的零钱兑换组合问题,要求计算给定无限硬币下凑成目标金额的组合数。该问题可转化为完全背包问题,关键点在于区分组合与排列:外层遍历硬币、内层遍历金额确保得到组合数。动态规划解法中,定义dp[i]表示金额i的组合数,状态转移方程为dp[i] += dp[i-coin]。初始化dp[0]=1表示金额0有1种组合方式。一维DP实现空间复杂度O(amount),时间复杂度O(amount×n)。注意遍历顺序对结果的影响,外层硬币确保只计算组合数而非排列数。测试用例需考虑边界情况如金

2025-11-19 16:20:30 582

原创 算法题 在每个树行中找最大值

本文介绍了解决 LeetCode 515 题"在每个树行中找最大值"的三种方法。问题要求返回二叉树每层节点的最大值数组。主推的层序遍历(BFS)方法使用队列按层处理节点,时间复杂度O(n),空间复杂度O(w)。另给出DFS递归方法,空间复杂度O(h),以及双队列变体。核心思想都是遍历树时记录每层最大值,适用于任意二叉树结构。

2025-11-19 15:51:50 470

原创 算法题 找树左下角的值

LeetCode 513. 找树左下角的值 算法思路与实现 本文探讨了寻找二叉树最底层最左边节点值的三种方法: 层序遍历(BFS):按层遍历树,记录每层第一个节点的值,最后留下的即为最底层最左边的值。时间复杂度O(n),空间复杂度O(w)。 深度优先遍历(DFS):递归遍历树,记录遇到的最大深度和对应的节点值。时间复杂度O(n),空间复杂度O(h)。 右到左层序遍历:从右到左遍历每层,最后一个访问的节点即为答案。时间复杂度O(n),空间复杂度O(w)。 通过比较不同方法的优缺点,可以选择适合具体场景的实现方

2025-11-14 16:43:44 559

原创 算法题 斐波那契数

文章摘要: LeetCode 509题要求计算斐波那契数F(n),其中F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)。本文介绍了6种解法:暴力递归(O(2^n))、记忆化递归(O(n))、动态规划(O(n))、空间优化DP(O(1)空间)、矩阵快速幂(O(log n))和Binet公式(O(1))。重点推荐空间优化DP(仅用两个变量迭代)和矩阵快速幂(高效处理大n)。测试示例显示,输入n=5时输出5,验证了算法的正确性。不同方法在时间/空间复杂度上各有优劣,可根据场景选择。

2025-11-14 16:28:13 342

原创 算法题 完美数

LeetCode 507. 完美数 摘要:完美数是指等于其所有真因子(不包括自身)之和的正整数。本文介绍了四种解决方法:(1) 优化因子遍历法(遍历到√num,利用因子成对特性);(2) 查表法(已知32位整数范围内仅5个完美数);(3) 完整因子收集法;以及(4) 基于欧几里得-欧拉定理的数学公式法。重点分析了因子成对特性和边界条件处理,时间复杂度为O(√n)或O(1),效率最高的是查表法和数学公式法。 关键词:完美数、因子成对、欧几里得-欧拉定理、梅森素数、算法优化

2025-11-14 16:16:48 254

原创 算法题 七进制数

摘要 LeetCode 504 要求将整数转换为七进制字符串表示。核心算法基于重复除法原理:对绝对值反复除以7,收集余数作为七进制各位数字,最后反转余数序列并处理符号。本文提供了四种解决方案:1)StringBuilder收集余数后反转;2)递归处理高位到低位;3)栈结构避免反转操作;4)数学方法直接计算数值。所有方法的时间复杂度均为O(log₇|num|),空间复杂度根据实现从O(1)到O(log₇|num|)不等。关键点是正确处理边界条件(0和负数)及理解余数收集顺序,该算法可扩展至任意进制转换场景。

2025-11-13 16:52:15 246

原创 算法题 二叉搜索树中的众数

摘要 LeetCode 501题要求找出二叉搜索树(BST)中的所有众数。本文介绍了三种解法:1)使用哈希表统计频率后进行筛选,时间复杂度O(n),空间复杂度O(n);2)两次中序遍历,第一次计算最大频率,第二次收集众数,空间复杂度O(1);3)优化为一次中序遍历,动态维护众数列表。解法3通过比较当前节点值与之前值,实时更新当前计数和众数列表,最终实现了O(1)空间复杂度(递归栈除外)。关键点在于利用BST中序遍历的有序性,通过比较相邻节点值来统计频率。

2025-11-13 16:37:31 485

原创 算法题 对角线遍历

摘要: LeetCode 498题要求对一个m×n矩阵进行对角线遍历,先沿右上方向,再沿左下方向交替遍历。解决方案包括:(1)方向模拟法:跟踪当前位置和方向,处理边界转向;(2)对角线分组法:按i+j值分组,奇数组正向遍历,偶数组反向遍历;(3)优化分组法:直接计算对角线起止位置。时间复杂度均为O(mn),空间复杂度O(1)或O(m+n)。

2025-11-13 16:21:07 410

原创 算法题 最大连续 1 的个数

这篇文章介绍了LeetCode 485题"最大连续1的个数"的多种解法。问题要求在一个二进制数组中找到最长的连续1序列长度。 主要方法包括: 单次遍历法:维护当前连续1计数和最大值,遇到0时重置计数 优化单次遍历:仅在遇到0或末尾时更新最大值 双指针滑动窗口:维护只包含1的窗口区间 字符串分割法:将数组转为字符串后用0分割 算法分析显示时间复杂度均为O(n),空间复杂度前三种为O(1)。文章提供了完整的Java代码实现、详细的问题解析、算法过程演示以及多种测试用例,包括标准示例、全1/全

2025-11-12 16:55:18 820

原创 算法题 数字的补数

摘要 LeetCode 476题要求计算整数的二进制补数,即对有效二进制位取反后得到的十进制数。关键挑战在于构造仅覆盖有效位的掩码,避免前导零干扰。本文介绍了四种解决方法: 逐位构造:通过移位操作构建与有效位等长的全1掩码 位移优化:利用32位全1掩码逐步校准至有效位长度 数学公式:使用2^k幂次构造掩码 内置函数:借助Integer.highestOneBit快速定位最高有效位 所有方法时间复杂度为O(log n),空间复杂度O(1)。核心思路都是通过位运算构造精确掩码,再使用异或操作实现有效位取反。特别

2025-11-12 16:35:25 576

原创 算法题 汉明距离

摘要 LeetCode 461题要求计算两个整数之间的汉明距离,即二进制位不同的位数。关键解法是:1)先通过异或运算x^y得到差异位掩码;2)统计该结果中1的个数。主要有四种实现方法:逐位检查(O(1))、Brian Kernighan算法(清除最低位1,O(k))、Java内置函数以及无符号右移处理负数。其中Brian Kernighan算法效率最高,循环次数等于1的个数。测试用例需覆盖标准示例、边界值和负数情况,注意Java中负数的补码表示会影响结果。

2025-11-12 16:23:57 949

原创 算法题 删除二叉搜索树中的节点

本文介绍了删除二叉搜索树中节点的三种情况和方法:1)叶子节点直接删除;2)单子节点用子节点替代;3)双子节点用右子树最小值(中序后继)或左子树最大值(中序前驱)替代。提供了递归和迭代两种实现,递归版本通过findMin方法找到右子树最小值作为替代节点,迭代版本则额外处理父节点连接。最后还给出了使用中序前驱的替代方案。

2025-11-12 10:45:30 461

原创 算法题 两数相加 II

摘要 LeetCode 445题要求对两个高位在前的链表表示的非负整数进行相加。与低位在前的问题不同,需要从尾部开始处理。提供了三种解法:1) 反转链表法:先反转链表,按低位方式相加后再反转结果;2) 栈法:利用栈实现从低位到高位的访问,不修改原链表;3) 递归法:通过递归处理相同长度部分。核心难点在于处理进位和保持结果高位在前的顺序,时间复杂度均为O(n),空间复杂度根据方法不同为O(1)到O(n)。

2025-11-11 16:41:31 749

原创 算法题 排列硬币

文章摘要: LeetCode 441题要求将n枚硬币排列成阶梯形,每行硬币数等于行号,求完整阶梯行数。解题思路:(1)暴力法逐行累计;(2)二分查找在区间[1,n]寻找最大k值;(3)数学公式直接求解二次方程。三种方法的时间复杂度分别为O(√n)、O(logn)和O(1)。关键点在于处理整数溢出和正确理解数学关系,其中二分查找需注意返回right边界值。测试用例需覆盖边界条件如n=0和大数情况。

2025-11-11 16:22:22 448

原创 算法题 Fizz Buzz

LeetCode 412题要求生成1到n的字符串数组,其中3的倍数输出"Fizz",5的倍数输出"Buzz",同时是3和5倍数的输出"FizzBuzz",否则输出数字本身。提供了两种Java实现方法:条件判断法(直接检查整除情况)和字符串拼接法(逐步构建结果字符串)。两种方法的时间复杂度均为O(n),空间复杂度为O(1)。关键点在于判断顺序,必须先检查15的倍数情况。示例展示了n=3、5、15时的正确输出。

2025-11-11 16:07:40 780

原创 算法题 分割数组的最大值

摘要: LeetCode 410题要求将数组分割成m个连续子数组,使得这些子数组各自和的最大值最小化。本文介绍了三种解法:1) 二分查找法(最优解),通过确定边界并验证中间值是否可行;2) 动态规划,使用二维数组dp[i][j]记录前i个元素分j份的最小最大值;3) 动态规划空间优化版本。二分法时间复杂度O(n*logS),动态规划为O(n²m)。核心思路是将问题转化为搜索满足条件的最小值,通过贪心或动态规划实现。

2025-11-07 16:55:58 611

原创 算法题 根据身高重建队列

摘要:LeetCode 406题要求根据身高重建队列。解题思路采用贪心算法结合插入排序:1) 按身高降序和k值升序排序;2) 逐个插入到结果列表的k位置。该方法确保高个子先安排,矮个子后插入不影响已排好的顺序。时间复杂度O(n²),空间复杂度O(n)。关键点是正确排序策略和插入位置的确定。

2025-11-07 16:34:40 276

原创 算法题 左叶子之和

摘要:本文介绍了LeetCode 404题"左叶子之和"的解法。问题要求计算二叉树中所有左叶子的值之和。提供了四种解法:带标志的递归(O(n)时间)、父节点法(最优)、BFS和DFS迭代法。核心思路是识别左叶子节点(既是叶子又是左子节点),通过递归或迭代遍历树结构。代码示例展示了Java实现,并分析了各方法的时间/空间复杂度。以示例树[3,9,20,null,null,15,7]为例,正确结果为24(9+15)。

2025-11-07 16:20:35 663

原创 算法题 第 N 位数字

题目要求在无限整数序列中找出第n位数字。该问题可以通过数学分组和定位的方法高效解决。核心思路是将数字按位数分组,确定n所在的位数范围后,计算具体的数字和该数字中的具体位置。算法分为三步:确定位数范围、定位具体数字、提取目标位。使用数学计算能避免构建整个序列,时间复杂度为O(log n),空间复杂度为O(1)。需注意边界条件和整数溢出问题,使用0-indexed计算能简化逻辑。该解法适用于大范围的n值(包括2³¹-1)。

2025-11-06 16:52:58 333

原创 算法题 字典序排数

摘要 LeetCode 386题要求将1到n的数字按字典序排列。字典序是基于字符串比较的数字顺序,例如"10"排在"2"前。该问题可以采用三种解法: DFS递归:将数字视为十叉树结构,通过深度优先搜索遍历生成字典序结果。时间复杂度O(n),空间复杂度O(log n)。 迭代模拟DFS:手动维护递归状态,使用循环模拟DFS过程。最优解,时间复杂度O(n),空间复杂度O(1)。 字符串排序:将数字转为字符串后排序,再转换回整数。简单但效率低,时间复杂度O(n log n)

2025-11-06 16:34:25 980

原创 算法题 打乱数组

LeetCode 384题要求实现数组的洗牌和重置功能。关键算法是Fisher-Yates洗牌算法,能够生成均匀随机排列。该算法从后往前遍历数组,对每个位置i随机选择索引j∈[0,i]进行交换,确保n!种排列概率均等。实现时需要保存原始数组副本用于reset操作,shuffle则创建新数组进行洗牌。时间复杂度O(n),空间复杂度O(n),满足最多10^4次调用的要求。

2025-11-06 16:17:37 814

原创 算法题 O(1) 时间插入、删除和获取随机元素

算法摘要 LeetCode 380题要求实现支持O(1)时间插入、删除和获取随机元素的数据结构。解决方案结合哈希表和动态数组: 数据结构: 使用哈希表存储元素到索引的映射 使用动态数组存储所有元素 关键操作: 插入:检查存在性后直接添加 删除:通过交换元素位置实现O(1)删除 随机获取:利用数组的随机访问特性 时间/空间复杂度: 所有操作平均O(1)时间 空间复杂度O(n) 这种设计巧妙结合了哈希表的高效查找和数组的随机访问优势,通过交换删除策略确保了所有操作的高效性。

2025-11-06 16:01:27 640

原创 算法题 有序矩阵中第 K 小的元素

文章摘要: LeetCode 378题要求在n×n的有序矩阵中找到第k小的元素。矩阵每行和每列均为升序排列。提供了三种解法:1)最小堆+访问集合法:利用最小堆优先处理候选元素,通过BFS遍历k次;2)二分查找法:在值域范围内二分搜索,统计≤mid的元素个数;3)归并排序思想:维护最小堆存储每行首元素,弹出k次获取结果。最优解法是二分查找,时间复杂度O(n log(max-min)),空间复杂度O(1)。三种方法分别适用于不同场景,平衡时间与空间复杂度需求。

2025-11-05 16:50:34 612

原创 算法题 摆动序列

LeetCode 376题要求计算整数数组中最长摆动子序列的长度。摆动序列是指相邻元素差值严格正负交替的序列,允许删除部分元素。解题思路主要有三种方法: 贪心算法:通过维护上升/下降状态,仅在趋势变化时增加序列长度。时间复杂度O(n),空间复杂度O(1)。 动态规划:维护两个dp数组分别记录以当前元素结尾的上升/下降摆动序列最大长度。时间复杂度O(n),空间复杂度O(n)。 峰值计数:统计局部极值点数量,结果等于极值数加1。时间复杂度O(n),空间复杂度O(1)。 最优解法是优化的贪心算法,仅用两个变量记录

2025-11-05 16:29:50 599

原创 算法题 查找和最小的 K 对数字

LeetCode 373题要求找到两个升序数组中构成和最小的k个数对。本文介绍了两种基于最小堆的解法:方法一使用最小堆和访问集合进行广度优先搜索,时间复杂度O(k log k);方法二通过优化初始化过程,时间复杂度降低为O(k log min(k, m))。两种方法都利用了数组的有序性质,方法二通过只向右扩展的策略进一步优化了空间复杂度。文章详细描述了算法思路、代码实现和复杂度分析,并通过示例演示了算法执行过程。

2025-11-05 16:14:41 885

原创 算法题 两整数之和

本文介绍了不使用加减运算符计算两整数之和的位运算方法。通过异或运算模拟不考虑进位的加法,与运算计算进位,迭代或递归处理进位值直至为0。关键点在于正确处理32位补码表示的负数,以及处理整数溢出问题。代码提供了迭代和递归两种实现,并详细分析了算法过程和测试用例,适用于正负整数相加的情况。时间复杂度为O(1),仅需最多32次位运算。

2025-11-04 16:43:11 699

原创 算法题 有效的完全平方数

**摘要:本文详细解析了LeetCode 367题"有效的完全平方数"的多种解法。重点介绍了三种算法:二分查找(O(logn))、牛顿迭代法(O(loglogn))和数学奇数和法(O(√n)),均能有效判断一个正整数是否为完全平方数。文章强调了整数溢出处理和边界条件,提供了Java代码实现、算法分析及测试用例,帮助读者全面理解不同方法的特点和适用场景。关键点包括中点计算避免溢出、数学性质利用等常见问题解决方法。

2025-11-04 16:32:52 483

原创 算法题 统计各位数字都不同的数字个数

LeetCode 357题要求统计各位数字都不同的数字个数。给定非负整数n,计算0到10ⁿ-1范围内数字各位都不重复的整数个数。关键思路是排列组合:1位数有10个,2位数有9×9=81个,3位数有9×9×8=648个等。当n=0时返回1,n=1返回10,n=2返回91。算法时间复杂度O(n),空间复杂度O(1)。解题需注意数字0的处理和首位不能为0的限制。

2025-11-04 16:22:58 783

原创 算法题 整数拆分

整数拆分问题要求将一个正整数拆分为至少两个正整数之和,并使这些数的乘积最大化。数学分析表明,最优拆分应尽可能多地使用3,其次使用2。提供了四种解法:数学方法直接计算3的幂次(O(log n)时间),快速幂优化版本,动态规划(O(n²)时间)以及贪心算法(O(n)时间)。代码示例展示了不同实现,数学方法效率最高。关键思路是将n按3分解,处理余数1时将一个3替换为两个2以获得更大乘积。测试案例验证了算法正确性。

2025-10-31 16:46:11 609

原创 算法题 4 的幂

本文探讨了判断一个整数是否为4的幂的五种方法: 循环除法:不断除以4直到余数不为0,最终检查是否为1 递归:递归检查是否能被4整除 位运算:利用4的幂二进制特性(1必须出现在奇数位) 最大幂整除:判断能否被32位整数最大4的幂(4^15)整除 数学对数:通过换底公式计算对数并检查是否为整数 各方法时间/空间复杂度分析表明,位运算和最大幂整除法最优(O(1))。测试用例验证了算法的正确性,涵盖标准4的幂(16,1,4,64)等情形。

2025-10-31 16:24:57 772

原创 算法题 奇偶链表

本文介绍了奇偶链表问题的解法,要求将奇数位置节点和偶数位置节点分别连接后合并。核心算法是使用双指针分离奇数链表和偶数链表,时间复杂度O(n),空间复杂度O(1)。算法步骤包括初始化指针、遍历分离节点以及连接两个链表。通过示例链表1->2->3->4->5的详细过程演示了算法运作,最终输出1->3->5->2->4->NULL。测试用例验证了不同场景下的正确性,包括标准示例、单节点、空链表等情况。

2025-10-31 16:06:28 265

原创 算法题 3 的幂

本文介绍了判断整数是否为3的幂次方的四种方法。方法一通过循环除法不断将n除以3,检查最终结果是否为1;方法二采用递归思路,检查n能否被3整除并递归验证n/3;方法三利用对数公式计算log₃(n),判断结果是否为整数;方法四利用32位整数范围内最大的3的幂(3^19=1162261467),检查n是否为其约数。四种方法的时间复杂度分别为O(log₃n)、O(log₃n)、O(1)和O(1),其中循环除法和最大幂整除法空间效率最佳。文章提供了详细代码实现和测试用例,验证了各方法的正确性。

2025-10-31 10:34:05 591

原创 算法题 最大单词长度乘积

摘要:本文介绍了求解字符串数组中无公共字符的两个字符串最大长度乘积问题的三种解法。暴力解法使用HashSet检查字符重复,时间复杂度O(n²×m)。位运算优化方法将字符转换为位掩码,通过按位与运算快速判断字符交集,时间复杂度O(n²+L)。最优解法使用HashMap存储位掩码到最大长度的映射,进一步优化性能。三种方法逐步提升效率,适合不同规模的输入数据。

2025-10-31 10:15:58 831

空空如也

空空如也

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

TA关注的人

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