自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 力扣-从中序与后序遍历序列构造二叉树

具体实现时,反向遍历后序数组(遍历顺序为「根→右→左」),用栈记录待处理的节点,通过哈希表快速定位节点在中序数组的索引:若当前节点索引大于栈顶节点索引,说明是栈顶的右子节点;若更小,则回溯栈找到父节点,作为父节点的左子节点,最终迭代完成整棵树的构建。两种方法逻辑完全对称:仅根节点位置(先序首元素/后序尾元素)、遍历方向(先序正序/后序逆序)、子节点判断条件(左子节点索引更小/右子节点索引更大)不同,核心都是通过栈记录节点、哈希表快速定位索引,规避递归缺陷的同时保证高效性。三、与先序+中序迭代法的核心关联。

2025-12-08 22:55:11 367

原创 力扣-从前序与中序遍历序列构造二叉树

依托先序遍历「根→左→右」的特性(先序数组首个元素为根节点),结合中序遍历「左→根→右」的特性拆分左右子树;相比递归实现,该迭代法在稳定性(无栈溢出)、效率(O(n) vs O(n²))、工程实用性(内存可控、适配性强)上均为最优;用于记录节点的栈结构分配在堆内存(而非系统栈),堆空间远大于系统栈,完全适配题目 3000 节点的最大输入规模,解决了递归版链式树场景下的栈溢出问题。无需修改核心逻辑,即可适配 1~3000 节点的所有输入场景,相比需调整系统栈大小的递归法,适配性更强。

2025-12-08 22:53:05 405

原创 力扣-位1的个数

对比固定遍历 32 位的方法,减少了 “遍历 0 的位” 的无效操作,在 1 的个数较少时(如 n=2、n=4、n=8)效率提升尤为显著。核心是利用位运算特性 n & (n - 1) 消除二进制最右侧的 1,通过统计消除操作的次数,直接得到二进制中设置位(1)的个数。题目中1 ≤ n ≤ 2³¹ - 1(32 位正整数),无需处理负数符号位,n & (n - 1) 对正整数的处理无任何漏洞;两者做按位与运算 n & (n - 1),结果为 ...0000(最右侧的 1 被消除,右侧的 0 保持不变);

2025-12-01 22:12:10 268

原创 力扣-颠倒二进制位

针对题目中 “0 ≤ n ≤ 2³¹-2、n 为偶数” 的约束,无需额外处理负数符号位、奇数 / 偶数特殊逻辑,循环 32 次的设计确保原数高位的 0(如示例 1 中前 8 位的 0)也能被正确颠倒到低位,结果精准匹配 32 位整数的格式要求;该方法的核心是逐位提取 + 反向填充:通过位运算逐位取出原数的二进制位(从最低位到最高位),同时将结果变量不断左移腾出空间,把提取的二进制位依次填充到结果的最低位,最终实现 32 位二进制位的整体颠倒。3. 空间复杂度最优(O (1))5. 适配题目约束且鲁棒性强。

2025-12-01 22:11:07 369

原创 力扣-第二高的薪水

逻辑简洁高效:步骤拆解清晰(去重→排序→取值→补 null),无冗余操作,数据库执行效率高(DISTINCT+ORDER BY+LIMIT 均为数据库原生优化的关键字,执行速度快);LIMIT 1 OFFSET 1 是分页取值逻辑:OFFSET 1 表示跳过前 1 条记录(即最高薪资),LIMIT 1 表示仅取 1 条记录(即第二高薪资);窗口函数法(RANK())原理:为不同薪资分配唯一排名(相同薪资排名相同,不同薪资排名递增),直接筛选 rank=2 即可定位第二高薪资;

2025-11-26 21:15:26 291

原创 力扣-第N高的薪水

null 返回原理:若不同薪资的数量<N(例如:仅 1 个唯一薪资,N=2),去重 + 排序后的结果集长度<N,OFFSET N-1 会跳过所有记录,LIMIT 1 无数据可取,查询返回空结果集;第 N 高的薪资对应结果集第 N 位,需跳过前 N-1 条记录(即 OFFSET N-1),因此需先执行 SET N = N - 1 完成参数转换(例如:N=2 时,偏移量为 1,跳过第 1 条高薪资,取第 2 条);适配任意 N(N≥1),仅需修改传入参数,无需重构代码,复用性强。

2025-11-26 21:14:00 396

原创 力扣-二叉树的前序遍历

返回填充好的结果数组。在最坏的情况下(例如,一棵退化成链表的树),树的高度 `h` 等于节点数 `n`,此时空间复杂度为 O(n)。1. 设计递归函数:定义一个辅助递归函数,它接收三个参数:当前遍历的根节点 `root`、用于存储遍历结果的数组 `result`、以及一个用于记录结果数组大小的指针 `returnSize`。前序遍历(Pre-order Traversal)是二叉树遍历的一种基础方式,其核心思路是按照 **“根节点 -> 左子树 -> 右子树”** 的顺序,递归地访问树中的每一个节点。

2025-11-16 23:00:26 277

原创 力扣-环形链表

如果链表 没有环,快指针会比慢指针先到达链表的末尾(NULL)。如果链表有环,两个指针相遇的时间取决于环的长度,最坏情况下为 O(n)。总结:对于 “判断链表是否有环” 这一问题,快慢指针法(Floyd's Algorithm)是首选的、标准的解决方案,因为它高效、节省空间且易于实现。适用性:该方法不仅可以判断是否存在环,还可以进一步用于 寻找环的入口节点 和 计算环的长度,是处理链表环相关问题的基石。如果循环因为 slow == fast 而退出,说明两个指针在环内相遇,链表存在环,返回 true。

2025-11-16 22:56:13 485

原创 力扣-买卖股票的最佳时机

第二步:计算当前卖出利润 current_profit = prices[i] - min_price(以当前价格卖出,基于历史最低买入价的利润);时间效率极高:仅需一次遍历数组,时间复杂度为 O (n)(n 为数组长度),适用于题目中 10^5 级别的数据规模,无超时风险;本质是通过 “贪心” 策略,在每一步都做出局部最优选择(更新最低买入价、保留最大利润),最终得到全局最优解,逻辑严谨且高效。返回结果:遍历结束后,max_profit 即为最大可获取利润,若为 0 则表示无盈利交易(如价格持续下跌)。

2025-11-16 22:54:02 507

原创 力扣-路径总和

在最坏的情况下,我们需要访问树中的每一个节点才能确定是否存在满足条件的路径。在最坏情况(例如,一棵退化成链表的树),高度 h 等于 n,此时空间复杂度为 O(n),可能会导致栈溢出。如果当前节点是叶子节点(root->left == NULL && root->right == NULL),我们检查 root->val 是否等于当前剩余的目标和。代码简洁直观:递归法的代码非常短,逻辑直接映射了问题的自然描述,易于理解和编写。可读性强:代码本身就解释了算法的思路,几乎不需要额外的注释。

2025-11-16 22:52:50 308

原创 二叉树的最小深度

空间复杂度为O(h)(h为树高),由递归栈深度决定,适合大规模树(如10⁵节点)。求二叉树最小深度的核心思路是:**从根节点出发,找到到达最近叶子节点的路径所包含的节点总数**(叶子节点指无左右子节点的节点)。3. 空节点处理:当某一子树为空时(如左子树为空),其深度用“极大值”表示(避免影响最小值计算),确保仅考虑非空的子树路径。1. 叶子节点判断:通过检查节点的左右子树是否均为空,确定是否为叶子节点(只有到达叶子节点的路径才有效)。2. 若节点是叶子节点(左右子树均为空),深度为1(仅自身节点)。

2025-11-03 23:33:46 336

原创 平衡二叉树-力扣

递归逻辑:利用二叉树的递归结构,将 “判断整棵树是否平衡” 拆解为 “判断根节点是否平衡”+“判断左子树是否平衡”+“判断右子树是否平衡”,逐层深入直到叶子节点。平衡判断原理:对每个节点,先判断自身的左右子树高度差是否合法(≤1),再递归判断左、右子树是否整体平衡。判断二叉树是否为平衡二叉树的核心思路基于平衡二叉树的定义:二叉树中每个节点的左右两个子树的高度差的绝对值不超过 1。高度计算原理:通过递归遍历二叉树,空节点高度为 0,非空节点的高度 = 左右子树高度的最大值 + 1(自身节点占一层)。

2025-11-03 23:32:09 261

原创 将有序数组转换为二叉搜索树-力扣

二叉搜索树(BST)特性:对任意节点,左子树所有节点值 < 节点值 < 右子树所有节点值。升序数组的左半部分元素天然小于中间元素,右半部分元素天然大于中间元素,因此分割后自然满足 BST 的数值关系。每次选择中间元素作为根节点,可保证左、右子树的节点数量最多相差 1(数组长度为奇数时相等,偶数时差 1),递归构建后左右子树高度差必然≤1,从而满足平衡条件。该方法的核心是中间元素为根,递归分割数组,既利用了升序数组的有序性满足 BST 的数值关系,又通过均衡分割保证了树的平衡性,是一种高效、简洁的构建方式。

2025-10-26 18:47:06 203

原创 二叉树的最大深度-力扣

计算二叉树的最大深度,本质是求从根节点到最远叶子节点的路径上的节点总数。两种方法的时间复杂度均为 O(n)(n 为节点数),空间复杂度分别为 O(h)(h 为树深度,递归栈)和 O(n)(队列存储节点)。循环处理每一层节点:统计当前层的节点数,依次出队并将其左、右子节点入队(下一层节点),每处理完一层,深度加 1。若当前节点非空,其深度 = 1(当前节点本身) + 左子树深度与右子树深度的最大值。递归计算左、右子树的深度,最终返回根节点的深度(即整棵树的最大深度)。1. 递归法(深度优先搜索,DFS)

2025-10-26 18:46:10 227

原创 力扣-上升的温度

匹配前一天记录:使用日期函数DATE_SUB(w1.recordDate, INTERVAL 1 DAY)计算w1记录日期的前一天,通过条件w1.recordDate = DATE_SUB(w2.recordDate, INTERVAL -1 DAY)(或等价的w2.recordDate = DATE_SUB(w1.recordDate, INTERVAL 1 DAY))将当天记录与前一天记录匹配。关键是利用日期函数计算 “前一天”,并通过连接条件匹配当天与前一天的记录,最后筛选出当天温度更高的记录。

2025-10-17 22:04:04 218

原创 力扣-删除重复的电子邮箱

通过自连接(表与自身连接)识别重复记录,依据 “相同电子邮件且 ID 更大” 的条件定位需要删除的重复项,最终保留每个电子邮件对应的最小 ID 记录。该方法通过自连接精准识别并删除重复电子邮件记录,仅保留最小 ID 的唯一记录,兼顾了逻辑正确性和执行效率,是处理此类重复数据删除问题的高效解决方案。连接条件设为p1.email = p2.email(确保比较相同电子邮件)和p1.id > p2.id(确保p1是重复项中 ID 更大的记录);将Person表与自身连接(别名p1和p2);

2025-10-17 22:02:55 143

原创 从不订购的客户-力扣

健壮性好:此方法不会受到 NULL 值的影响。因此,我们只需要在连接后的结果中,添加一个 WHERE 子句来筛选出 Orders 表中任意一个字段为 NULL 的行,就可以精确地找到那些没有订单的客户。基于上述左连接的特性,那些没有下过订单的客户,在与 Orders 表连接后,其来自 Orders 表的所有字段(如 o.id, o.customerId)都会是 NULL。核心思路是:先将客户表(Customers)和订单表(Orders)进行左连接,然后筛选出在订单表中没有匹配到任何记录的客户。

2025-10-09 23:08:51 397

原创 组合两个表-力扣

它告诉数据库如何匹配两个表中的行 —— 即当 Person 表的 PersonId 与 Address 表的 PersonId 相同时,这两行是匹配的。通过本问题,我们可以得出一个通用结论:当需要以一个表为基础,去匹配另一个表的数据,并且不希望因为另一个表中没有对应记录而丢失基础表的数据时,就应该优先考虑使用 LEFT JOIN。对于 “查询主表所有信息,并关联副表信息,如果副表没有匹配则显示为 NULL” 这类问题,左连接(LEFT JOIN)是最直接、最高效且最标准的解决方案。

2025-10-09 23:07:16 617

原创 查找重复的电子邮箱-力扣

此处HAVING COUNT(email) > 1的逻辑是:仅保留 “组内记录数大于 1” 的组 —— 因为只有这类组对应的邮箱,在原表中存在多条记录,符合 “重复” 的定义。按目标字段分组归类:以 “电子邮件(email)” 为唯一分组依据,通过GROUP BY email将表中所有记录划分成若干组 —— 相同邮箱地址的记录会被归为同一组(比如示例中 “a@b.com” 的 2 条记录形成一个组),不同邮箱地址的记录则各自成组(比如 “c@d.com” 的 1 条记录单独成组)。

2025-10-01 22:14:59 615

原创 超过经理收入的员工-力扣

由于员工和经理的信息存储在同一张表(Employee)中,核心思路可概括为:将单张表拆解为 “员工视角” 和 “经理视角” 两个逻辑表,通过 “经理 ID” 建立关联,再筛选出 “员工薪资 > 经理薪资” 的记录。无论哪种方案,都依赖 “员工表的managerId(外键)” 与 “经理表的id(主键)” 的对应关系 —— 这是将 “员工” 和 “其经理” 绑定的唯一依据。两种方案的核心逻辑一致:均通过 “关联员工与经理数据” 实现薪资比较,区别仅在于 “关联数据的方式”(显式JOIN vs 隐式子查询)。

2025-10-01 22:11:04 300

原创 只出现一次的数字-力扣

利用位运算中的异或操作特性,对数组中所有元素进行累积异或运算,最终结果即为只出现一次的元素。由于数组中除目标元素外,其余元素均出现两次,异或运算会自然抵消重复元素,最终保留唯一的单次出现元素。3. 交换律与结合律:异或运算顺序不影响最终结果(`a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b`),确保无论重复元素的位置如何,都能正确抵消。1. 时间效率最优:时间复杂度为O(n)(n为数组长度),仅需一次遍历即可完成计算,无冗余操作,完全满足线性时间要求。初始化结果变量为0。

2025-09-20 23:22:14 195

原创 验证回文串-力扣

4. 稳定性与兼容性好:依赖C语言标准库的`isalnum`(判断字母数字)和`tolower`(转小写)函数,处理所有可打印ASCII字符,符合题目输入要求,边界情况(如空字符串、全非字母数字字符串)均能正确覆盖。通过左右两个指针从字符串两端向中间逼近,跳过非字母数字字符后,对比对应位置字符(统一转为小写),若全程匹配则为回文串,否则不是。3. 字符匹配校验:将左右指针指向的字符通过`tolower`函数统一转为小写,若二者不相等,直接判定为非回文串并返回`false`。

2025-09-20 23:19:47 216

原创 杨辉三角||-力扣

该实现通过巧妙的单数组复用策略,在保证时间效率的同时,将空间复杂度优化到了理论最小值,完美满足进阶要求。2. 从倒数第二个元素开始向前计算:`row[j] = 原row[j] + row[j-1]`3. 原row[j]实际代表上一行的第j个元素,row[j-1]代表上一行的第j-1个元素。1. 空间最优:空间复杂度降至O(rowIndex),仅使用一个一维数组。1. 单数组复用:仅使用一个一维数组存储数据,通过迭代更新获取目标行。2. 逆向更新:从后往前计算中间元素,避免覆盖尚未使用的前一行数据。

2025-09-12 16:43:08 176

原创 杨辉三角-力扣

该实现充分利用了杨辉三角的特性,以最直接的方式构建三角形,既保证了正确性,又兼顾了效率和可读性。3. 中间元素递推:每行的中间元素(非首尾)通过上一行相邻两个元素相加得到。5. 输入验证:对输入值进行合法性检查,确保在题目要求的范围内(1-30)其他情况,元素值 = 第i-1行第j-1列元素 + 第i-1行第j列元素。1. 逐层构建:从第0行开始,依次生成每一行的元素,直到达到指定的行数。2. 空间优化:按需分配内存,第i行只分配i+1个元素的空间。2. 边界固定:每行的第一个和最后一个元素始终为1。

2025-09-12 16:22:55 253

原创 对称二叉树-力扣

轴对称二叉树的核心特征是:对于任意一对对称节点(左子树中的节点 A 和右子树中的节点 B),A 的左孩子需与 B 的右孩子对称,A 的右孩子需与 B 的左孩子对称。该实现通过递归将复杂的对称判断转化为可复用的子问题校验,以简洁高效的方式解决二叉树轴对称问题,是递归思想在树结构中的经典应用。代码直接映射 “镜像对称” 的数学定义,通过 “交叉递归校验” 准确实现对称判断,无需额外复杂逻辑,可读性强。否则递归校验:left的左子树与right的右子树、left的右子树与right的左子树是否均镜像对称。

2025-08-24 22:20:51 479

原创 相同的树-力扣

因此,判断两棵树是否相等可拆解为 “判断根节点是否一致” 和 “判断左右子树(子问题)是否一致”,符合递归算法 “大问题拆小问题,小问题解法与大问题一致” 的核心思想。递归校验子树:若当前节点结构和值均一致,需进一步递归校验左子树(p->left 与 q->left) 和右子树(p->right 与 q->right),只有左右子树均一致时,才返回true。单空校验:若其中一个节点为NULL,另一个不为NULL,说明结构存在差异(一个有节点、一个无节点),返回false;

2025-08-24 22:18:36 416

原创 二叉树的中序遍历-力扣

采用栈辅助的迭代遍历策略,模拟递归过程中隐式的函数调用栈,按照 "左子树→根节点→右子树" 的顺序访问节点,通过手动管理栈结构实现非递归遍历。效率优秀:时间复杂度 O (n)(每个节点访问一次),空间复杂度 O (h)(h 为树高,最坏情况 O (n))转向该节点的右子节点,重复上述过程(右子树同样遵循左→根→右顺序)外层循环条件确保:即使当前节点为空,只要栈中有节点就继续处理。从根节点出发,将所有左子节点依次入栈,直到最左叶子节点。栈的作用:存储待访问的节点,替代递归时的函数调用栈。

2025-08-17 23:32:40 246

原创 合并两个有序数组-力扣

采用双指针从后向前合并的策略,利用 nums1 尾部的空闲空间(初始为 0 的部分)作为合并空间,避免覆盖未处理的元素。这种方法完美利用了题目给出的 nums1 长度为 m+n 的条件,是解决该问题的最优方案。当 nums2 的所有元素都处理完毕(j < 0),合并完成。操作安全:从后向前合并避免了覆盖 nums1 中未处理的元素。指针 i 指向 nums1 有效元素的末尾(索引 m-1)比较 nums1 [i] 和 nums2 [j] 的大小。指针 j 指向 nums2 的末尾(索引 n-1)

2025-08-17 23:30:31 137

原创 爬楼梯-力扣

因此,第 n 阶的爬法数 = 第 n-1 阶的爬法数 + 第 n-2 阶的爬法数,即递推公式:f(n) = f(n-1) + f(n-2)时间效率高:采用迭代法而非递归,时间复杂度为 O(n),避免了递归中重复计算的问题(递归时间复杂度为 O(2^n))。初始化前两阶的爬法数(first = 1 对应 f(1),second = 2 对应 f(2))稳定性好:迭代过程中无栈溢出风险(递归在 n 较大时可能栈溢出),且计算过程直观可控。基础边界:f(1) = 1(1 种方法),f(2) = 2(2 种方法)

2025-08-10 22:12:59 303

原创 删除排序链表中的重复元素-力扣

排序链表的重复元素具有连续性,这是解决问题的关键。无需额外空间记录已出现元素,只需通过相邻节点比较就能识别重复项,通过调整指针指向实现重复节点的删除。这种方法充分利用了题目中"链表已排序"的条件,以最小的资源消耗完成去重操作,是该问题的最优解法之一。1. 时间效率高:仅需一次遍历链表,时间复杂度为O(n)(n为链表长度)3. 若值相同,删除下一个节点(通过修改指针跳过该节点并释放内存)5. 逻辑简洁:利用排序特性简化重复判断,无需复杂的数据结构辅助。3. 操作直观:直接在原链表上修改指针,无需创建新链表。

2025-08-10 22:11:07 337

原创 x的平方根-力扣

通过mid = low + (high - low)/2的方式计算中间值,避免low+high直接相加导致的溢出。4. 当low > high时,循环结束,high即为x的平方根的整数部分(最大的小于等于√x的整数)平方运算在[0, +∞)上是单调递增的,即若a < b,则a² < b²(a, b ≥ 0)无需复杂的数学公式或额外的数据结构。若mid² > x,说明需要更小的候选值,调整high = mid - 1。若mid² < x,说明需要更大的候选值,调整low = mid + 1。

2025-08-03 23:42:44 144

原创 二进制求和-力扣

空间复杂度 O (max (n,m)),仅需存储结果的空间。鲁棒性:自动处理不同长度的输入字符串,正确处理最高位进位的特殊情况,无需依赖额外的库函数。这种实现既高效又易于理解,非常适合处理最长 10^4 位的二进制字符串加法问题。处理边界:当一个字符串处理完毕后,继续处理另一个字符串剩余位和进位。反向遍历:从两个字符串的最后一位(最低有效位)开始处理。从两个二进制字符串的末尾(最低位)开始逐位相加。当所有位处理完毕后,若仍有进位,需添加到结果中。累加计算:将对应位的数值与进位相加。

2025-08-03 23:39:36 400

原创 加一-力扣

如果当前位 < 9:直接加 1,无需进位,返回原数组。这个算法的核心思路是模拟手工加法,从最低位(数组末尾)开始逐位处理,遇到进位则继续向前,直到无需进位或处理完所有位。最坏情况下(如全 9 数组)需遍历整个数组一次。全 9 数组:自动触发数组扩容,生成比原数组多一位的新数组(如[9,9,9] → [1,0,0,0])。无需进位:遇到第一个小于 9 的位后立即返回,无需继续遍历(如[1,2,3] → [1,2,4])。前导零处理:由于最高位进位时才会创建新数组,且新数组首位为 1,自然保证结果无前导零。

2025-07-27 23:42:08 507

原创 最后一个单词的长度-力扣

从 end 位置继续向前遍历,直到遇到下一个空格或字符串开头,标记此位置为 start。数学关系:单词长度 = 结束位置 - 起始位置(例如,"World" 的 end=10,start=5,长度为 10 - 5 = 5)。这个思路的精妙之处在于利用逆向遍历和双指针定位,简洁高效地解决了问题,同时优雅处理了各种边界条件(空字符串、全空格、单词间多空格等)。从字符串的最后一个字符开始向前遍历,跳过所有空格字符,直到找到第一个非空格字符。关键逻辑:若字符串全是空格,end 会减至 -1,直接返回 0。

2025-07-27 23:38:31 380

原创 搜索插入位置-力扣

中间值计算:使用 mid = left + (right - left) / 2 避免整数溢出,尤其在处理大规模数组时更安全。当循环结束时(left > right),left 恰好指向第一个大于等于目标值的位置,即插入位置。边界处理优雅:自动处理目标值小于最小值(插入位置为 0)、大于最大值(插入位置为数组长度)等边界情况。适用性广:适用于所有有序数组的搜索 / 插入场景,包括存在重复元素的情况(本题中数组无重复元素)。插入位置推导:循环结束时,left 的位置即为插入位置。

2025-07-20 21:14:37 262

原创 找出字符串中第一个匹配项的下标-力扣

2. 遍历所有可能的起始位置:从主串的第一个字符开始,逐个检查每个可能的起始位置 `i`,直到剩余字符不足以容纳子串(即 `i ≤ len_h - len_n`)。3. 字符逐个比较:对于每个起始位置 `i`,检查子串 `needle` 的每个字符是否与主串从 `i` 开始的对应字符匹配。如果子串的所有字符都匹配成功(即 `j` 等于子串长度 `len_n`),返回当前起始位置 `i`。4. **未找到匹配时返回 `-1`:如果遍历完所有可能的起始位置都没有找到匹配,返回 `-1`。

2025-07-20 21:10:13 243

原创 移除元素-力扣

思路:使用快慢指针,慢指针 k 记录有效元素位置,快指针遍历数组。思路:使用左右指针,左指针从前往后找等于 val 的元素,右指针从后往前找不等于 val 的元素,然后交换。两种算法均严格遵循原地修改要求,不使用额外数组,直接在原数组上操作,符合空间效率要求。混合情况:[3,2,2,3],val=3 → 返回 2,数组前两位为 [2,2]。全目标元素:[2,2,2],val=2 → 返回 0,数组内容不变。无目标元素:[1,2,3],val=4 → 返回 3,数组不变。

2025-06-02 21:11:47 497

原创 删除有序数组中的重复项-力扣

全重复元素:[1,1,1] → 返回 1,数组变为 [1,1,1](前 1 个元素有效)混合情况:[1,1,2,2,3] → 返回 3,数组变为 [1,2,3,2,3]通过检查返回值 k 和数组的前 k 个元素是否符合预期来验证算法正确性。k 指针记录当前唯一元素的位置(初始为 1,因为第一个元素默认保留)。如果不同,则将当前元素复制到 k 位置,并递增 k。无重复元素:[1,2,3] → 返回 3,数组不变。遍历数组,比较当前元素与前一个元素是否不同。特殊情况处理:当数组为空时直接返回 0。

2025-06-02 21:10:20 176

原创 合并两个有序链表-力扣

代码正确性:提供的 C 语言代码通过迭代法正确解决了合并两个升序链表的问题。代码严格遵循题目约束,处理了所有边界情况(如空链表、不同长度链表),确保合并后的链表保持升序。边界处理:自动处理空链表和剩余节点,无需额外判断。内存优化:直接复用原链表节点,无需创建新节点,节省内存。时间复杂度:O (m + n),需遍历两个链表各一次,其中 m 和 n 分别为链表长度。空间复杂度:O (1),仅使用常数级额外空间(虚拟头节点和尾指针)。直接复用原链表节点,无需创建新节点。取较小值节点接入结果链表。

2025-05-25 21:17:33 393

原创 有效的括号-力扣

它通过栈结构有效地验证了字符串中括号的有效性,确保每个右括号都有对应的左括号,且顺序正确。栈的特点是后进先出(LIFO),非常适合处理这种需要按顺序闭合的括号问题。时间复杂度:代码的时间复杂度为 O (n),其中 n 是字符串的长度。在最坏情况下(例如全部是左括号),栈的深度可能达到字符串的长度。处理右括号:遇到右括号时,检查栈顶元素是否为对应的左括号。健壮性:代码能够处理所有可能的输入情况,包括无效的字符(默认返回 false)和不匹配的括号顺序。检查栈的状态:遍历结束后,如果栈为空,则字符串有效;

2025-05-25 21:14:51 198

空空如也

空空如也

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

TA关注的人

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