自定义博客皮肤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)
  • 收藏
  • 关注

原创 LC106 从中序与后序遍历序列构造二叉树

是同一棵树的后序遍历,请你构造并返回这颗。根节点左侧是左子树,右侧是右子树。(1)后序确定根,中序分左右。是二叉树的中序遍历,(2)使用哈希表加速查找。在中序中找到根节点位置。最后一个元素是根节点。

2025-12-07 15:48:35 303

原创 LC105 从前序与中序遍历序列构造二叉树

在中序遍历中找到这个根节点,根节点左边的所有元素构成左子树的中序遍历,右边的所有元素构成右子树的中序遍历。左子树的先序遍历序列:从原先序遍历的第二个元素开始,取左子树大小的部分。左子树的中序遍历序列:从中序遍历序列开始到根节点位置之前的部分。右子树的中序遍历序列:从根节点位置之后到中序遍历序列末尾的部分。根据左子树的大小,可以在先序遍历中确定左右子树的先序遍历序列。右子树的先序遍历序列:左子树先序遍历序列之后的所有元素。先序遍历的第一个元素总是整棵树的根节点。2.在中序遍历序列中找到该根节点的位置。

2025-12-07 15:48:22 340

原创 LC191 位1的个数

编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数(也被称为。》时间复杂度:O(k),其中k为整数位数(对于32位整数为O(32)):通过分治思想,将统计1的个数分解为多个小问题并行解决。:查表法通过预计算结果来加速实际计算。遍历整数的每一位,检查该位是否为1。消去最低位的1是核心技巧之一。中,共有 30 个设置位。中,共有 1 个设置位。》空间复杂度:O(1)

2025-12-01 20:51:31 270

原创 LC190 颠倒二进制位

这个问题要求我们颠倒一个32位有符号整数的二进制位。:将取出的位放到结果数的对应位置(原最低位变成结果的最高位)颠倒给定的 32 位有符号整数的二进制位。:通过循环逐位处理,结合移位操作构建结果。:从最低位开始,依次取出原数的每一位。:需要处理32次(32位整数)是获取整数最低位的经典方法。左移一位为新的位腾出空间。:使用位操作技巧批量处理位。

2025-12-01 20:51:14 320

原创 LC177 第N高的薪水

id 是该表的主键(列中的值互不相同)。该表的每一行都包含有关员工工资的信息。跳过前 M 条记录,取第 M+1 条。个不同工资,查询结果应该为。:第 N 条记录的偏移量是。:当查询无结果时自动返回。编写一个解决方案查询。查询结果格式如下所示。来定位第 N 条记录。

2025-11-24 17:25:42 243

原创 LC176 第二高的薪水

多个员工可能有相同的薪水,我们需要的是不同的薪水值。如果不存在第二高的薪水,查询应该返回。但需要处理没有第二条记录时返回NULL的情况。:利用子查询自动返回NULL的特性处理空结果。:当表中记录不足时,需要优雅地返回NULL。最终选择用子查询来自然处理NULL情况。表的每一行包含员工的工资信息。:通过降序排列找到第二高的记录。:确保返回的字段名符合要求。:简洁地获取指定位置的记录。:确保处理重复薪水的情况。id 是这个表的主键。查询结果如下例所示。

2025-11-24 17:25:25 288

原创 LC144 二叉树的前序遍历

巧妙利用空闲的右指针记录回溯路径。

2025-11-16 22:23:29 285

原创 LC141 环形链表

通过不同速度的指针检测循环。

2025-11-16 22:23:15 282

原创 LC121 买卖股票的最佳时机

给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择买入这只股票,并选择在卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。5在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。0。

2025-11-09 14:02:19 257

原创 LC112 路径总和

将大问题分解为小问题,通过递归解决子树问题。

2025-11-09 14:01:54 296

原创 LC111 二叉树的最小深度

这是最小深度问题的关键。

2025-11-02 16:43:19 277

原创 LC110 平衡二叉树

给定一个二叉树,判断它是否是 平衡二叉树truefalseroot = []true。

2025-11-02 16:42:59 341

原创 LC108 将有序数组转换为二叉搜索树

将大问题分解为小问题,分别解决。

2025-10-24 17:02:11 164

原创 LC104 二叉树的最大深度

将大问题分解为小问题(子树)

2025-10-24 17:01:56 223

原创 LC197 上升的温度

巧妙使用同一表的多次实例化进行数据比较。

2025-10-17 17:57:48 384

原创 LC196 删除重复的电子邮箱

我们保留最小的Id = 1。该表的每一行包含一封电子邮件。驱动程序将首先编译并运行您的代码片段,然后再显示。这样就能确保每个电子邮件只保留一条记录(具有最小。(对于 SQL 用户,请注意你应该编写一个。所有重复的电子邮件,只保留一个具有最小。id 是该表的主键列(具有唯一值的列)。使用子查询找到每个电子邮件对应的最小。:删除所有不满足保留条件的重复记录。:找到所有出现多次的电子邮件地址。:对于每个重复的邮件,只保留。运行脚本后,显示的答案是。来找到每个组的最小值。来排除需要保留的记录。

2025-10-17 17:57:36 296

原创 LC183 从不订购的客户

customerId 是 Customers 表中 ID 的外键( Pandas 中的连接键)。:对于没有下过订单的客户,在连接后的 Orders 表相关字段会显示为 NULL。:将 Customers 表作为主表,Orders 表作为从表进行左连接。该表的每一行都表示订单的 ID 和订购该订单的客户的 ID。该表的每一行都表示客户的 ID 和名称。在 SQL 中,id 是该表的主键。在 SQL 中,id 是该表的主键。找出所有从不点任何东西的顾客。解决这个问题的核心思路是使用。

2025-10-09 20:03:58 404

原创 LC175 组合两个表

确保主表(Person)的所有记录都被返回,即使关联表(Address)中没有匹配记录。地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。:使用LEFT JOIN实现左外连接,确保Person表的所有记录都被保留。addressId 是该表的主键(具有唯一值的列)。personId 是该表的主键(具有唯一值的列)。该表包含一些人的 ID 和他们的姓和名的信息。需要保留Person表中的所有记录。

2025-10-09 20:03:39 498

原创 LC182 查找重复的电子邮箱

编写解决方案来报告所有重复的电子邮件。请注意,可以保证电子邮件字段不为 NULL。此表的每一行都包含一封电子邮件。电子邮件不包含大写字母。如果要删除重复记录,只保留每个邮箱的最新记录?id 是该表的主键(具有唯一值的列)。:找出在表中出现超过一次的电子邮件地址。字段上创建索引可以显著提高查询性能。:这是解决重复数据问题的经典组合。关键字为结果列指定有意义的名称。a@b.com 出现了两次。:只返回重复的电子邮件地址。子句筛选出重复的记录。:统计每组的记录数量。

2025-09-30 18:03:13 284

原创 LC181 超过经理收入的员工

场景,需要将同一张表的不同行进行关联比较。:使用不同的别名将同一张表虚拟成两个独立的表。编写解决方案,找出收入比经理高的员工。:在连接后的结果中比较员工与经理的薪资。Joe 是唯一挣得比经理多的雇员。Joe 是唯一挣得比经理多的雇员。:同一张表使用不同别名进行连接。:通过别名区分不同的角色视角。:利用外键关系建立数据关联。建立员工与经理的关联。

2025-09-30 18:02:44 368

原创 LC136 只出现一次的数字

解决方案:先对所有元素进行异或,得到两个目标元素的异或结果。然后找到这个结果中任意一个为1的位,根据这一位将数组分成两组,分别在这两组中找出只出现一次的元素。基于这些特性,我们可以将数组中所有元素进行异或操作,出现两次的元素会相互抵消为0,最后剩下的结果就是只出现一次的元素。,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。如果数组中有两个元素只出现一次,其余元素都出现两次,如何找出这两个元素?

2025-09-20 17:58:13 153

原创 LC125 验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个。在移除非字母数字字符之后,s 是一个空字符串 ""。由于空字符串正着反着读都一样,所以是回文串。"amanaplanacanalpanama" 是回文串。在遍历过程中跳过非字母数字字符,避免创建新字符串。:使用左右两个指针分别从字符串首尾向中间移动。使用双指针法从两端向中间遍历,减少比较次数。"raceacar" 不是回文串。函数将字符统一转换为小写进行比较。字母和数字都属于字母数字字符。

2025-09-20 17:58:01 195

原创 LC119 杨辉三角 II

杨辉三角是一个经典的数学概念,其第 n 行(从0开始计数)有 n+1 个元素,且首尾元素均为1。中间的第 i 个元素(从0开始)等于上一行的第 i-1 个元素与第 i 个元素之和。对于行数从2到 rowIndex,从后往前更新数组中的每个元素(除了首尾),使其等于上一行的当前元素和前一元素之和。我们可以使用动态规划的思想,通过一维数组从后往前更新来避免使用二维数组,从而节省空间。利用杨辉三角的递推关系:每个数等于它左上方和右上方的数之和。在「杨辉三角」中,每个数是它左上方和右上方的数的和。

2025-09-12 20:21:50 249

原创 LC118 杨辉三角

杨辉三角是一个经典的数学概念,也被称为帕斯卡三角。在「杨辉三角」中,每个数是它左上方和右上方的数的和。对于中间的元素,使用上一行对应位置的元素之和来计算。如何只计算杨辉三角的第n行而不生成整个三角形?对于每一行,首先设置第一个和最后一个元素为1。注意边界条件处理(第一行和每行的首尾元素)如何将杨辉三角应用于概率计算和组合问题?利用动态规划思想,基于上一行计算当前行。生成「杨辉三角」的前 numRows。中间的每个元素等于它上方两个元素之和。每一行的第一个和最后一个元素都是1。杨辉三角与二项式定理有何关系?

2025-09-12 20:21:41 273

原创 LC101 对称二叉树

创建一个辅助函数,递归地比较左子树的左节点与右子树的右节点,以及左子树的右节点与右子树的左节点。本文使用固定大小的数组作为队列,可以考虑使用动态数据结构(如链表)来实现队列,避免数组大小限制。每次从队列中取出两个节点进行比较,判断它们是否满足镜像关系。将需要进一步比较的子节点对按镜像顺序加入队列。是检查树的左右子树是否互为镜像。使用队列按层比较对称位置的节点。给你一个二叉树的根节点。, 检查它是否轴对称。判断二叉树是否轴对称的。

2025-08-24 21:24:40 396

原创 LC100 相同的树

解决这个问题的关键在于同时遍历两棵二叉树,并比较它们的结构和节点值。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。如果一个节点为空而另一个不为空,说明两棵树结构不同,返回。只需稍微修改递归调用:比较左子树与右子树,右子树与左子树。:将大树问题分解为子树问题,是解决树结构问题的核心技巧。:在处理递归问题时,优先考虑最简单的情况(如空节点),编写一个函数来检验这两棵树是否相同。:通过同时遍历两棵树来比较它们的结构和值。如果两棵树的当前节点都为空,返回。如果两个节点的值不相等,返回。

2025-08-24 21:22:52 323

原创 LC94 二叉树的中序遍历

深度超过1000的大树(避免递归栈溢出)栈顶指针:回溯时获取最近未访问节点。:外层控制遍历状态,内层实现左深入。:根据树深度自动扩展栈和结果数组。:显式维护栈结构代替递归调用栈。二叉搜索树:中序遍历即有序序列。表达式树:中序生成中缀表达式。文件系统遍历:目录树结构处理。给定一个二叉树的根节点。指针:沿左子树深入到底。

2025-08-17 20:04:55 218

原创 LC88 合并两个有序数组

给你两个按排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你nums2到nums1中,使合并后的数组同样按排列。最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。需要合并 [1,2,3] 和 [2,5,6]。合并结果是 [,2,,5,6] ,其中斜体加粗标注的为 nums1 中的元素。[1]

2025-08-17 20:04:35 472

原创 LC83 删除排序链表中的重复元素

要解决这个问题,我们可以采用一次遍历的方法,具体思路如下:​。:可使用哈希表记录已出现元素,但需 $O(n)$ 额外空间。(不留副本):需双指针记录前驱节点,处理连续重复序列。:利用排序特性,通过相邻节点比较一次遍历完成去重。删除所有重复的元素,使每个元素只出现一次。:直接修改节点指针指向,无需额外空间。需要保持原始相对顺序的数据处理。给定一个已排序的链表的头。已排序链表的去重操作。

2025-08-11 23:14:30 241

原创 LC70 爬楼梯

每次可爬1/2/3阶:dp[i]=dp[i-1]+dp[i-2]+dp[i-3]你有多少种不同的方法可以爬到楼顶呢?斐波那契数列变种(青蛙跳台阶、铺瓷砖等)1. 1 阶 + 1 阶 + 1 阶。计数类问题(路径规划、方法统计):快速建立问题与经典数列的关联。最后一步爬1阶:方法数 =最后一步爬2阶:方法数 =有两种方法可以爬到楼顶。1. 1 阶 + 1 阶。有三种方法可以爬到楼顶。2. 1 阶 + 2 阶。3. 2 阶 + 1 阶。(无台阶时视为1种方法)

2025-08-11 23:14:11 331

原创 LC69 x的平方根

一.任务描述:给你一个非负整数 ,计算并返回 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 或者 。 示例 1:示例 2: 二.解题思路:核心算法:二分查找法问题转化:求算术平方根的整数部分等价于寻找最大的整数 ,使得 边界处理:当 时直接返回 0当 时,平方根的范围在 [1, x] 之间二分查找流程:初始化左边界 ,右边界 循环直到 :计算中点 (防溢出)比较 与 ::找到精确解:解在右半区间,:解在左半区间

2025-08-03 16:48:18 362

原创 LC67 二进制求和

一.任务描述:给你两个二进制字符串 和 ,以二进制字符串的形式返回它们的和。示例 1:示例 2:二.解题思路:模拟人工计算二进制加法的过程:从低位到高位:从两个字符串的末尾开始处理(即二进制数的最低位)逐位相加:对应位数字相加并加上进位值计算进位:如果和 ≥2,则产生进位(二进制进位是除以2)处理不同长度:短字符串高位补0处理处理最终进位:如果最后还有进位,需要添加最高位三.代码实现:C: 四.优化方向:1.位运算优化:可以使用位运算替代除法和取模运算2.内存优化:精确计算所需内存空间,避免

2025-08-03 16:47:45 309

原创 LC66 加一

给定一个表示的整数数组digits,其中digits[i]是整数的第i位数字。这些数字按从左到右,从最高位到最低位排列。这个大整数不包含任何前导0。将大整数加 1,并返回结果的数字数组。[1,2,4]输入数组表示数字 123。加 1 后得到 123 + 1 = 124。因此,结果应该是 [1,2,4]。[4,3,2,2]输入数组表示数字 4321。加 1 后得到 4321 + 1 = 4322。因此,结果应该是 [4,3,2,2]。[1,0]输入数组表示数字 9。加 1 得到了 9 + 1 = 10。

2025-07-27 19:04:36 430

原创 LC58 最后一个单词的长度

若需获取最后一个单词本身(而非长度),可记录起始位置配合 memcpy 实现。从字符串末尾开始向前遍历,忽略所有尾部空格,定位到最后一个单词的结尾字符。从步骤1定位的位置开始,继续向前遍历并计数,直到遇到空格或字符串开头。,由若干单词组成,单词前后用一些空格字符隔开。是指仅由字母组成、不包含任何空格字符的最大子字符串。反向遍历是解决此类问题的关键,避免处理复杂的前导空格。最后一个单词是长度为 6 的“joyboy”。最后一个单词是“World”,长度为 5。最后一个单词是“moon”,长度为 4。

2025-07-27 19:03:42 261

原创 LC35 搜索插入位置

循环结束时 left 指针指向第一个大于 target 的元素位置,该位置即为 target 应该插入的位置。给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。由于数组已排序且要求 O(log n) 的时间复杂度,二分法是最佳选择。若 target 大于所有元素,left 会停在 numsSize(数组末尾后)。有序数组 + O(log n) 复杂度 = 二分查找变体,是解决此类问题的标准范式。1.找到目标值:直接返回中间索引 mid。

2025-07-20 19:54:43 456

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

这是一种高效的字符串匹配算法,它通过预处理needle得到一个部分匹配表(也称为前缀函数),利用这个表可以在匹配过程中避免不必要的字符比较,从而将时间复杂度优化到 O (n + m)。:该算法从needle的末尾开始比较,并且有两种启发式规则(坏字符规则和好后缀规则)来决定每次跳过的字符数,在实际应用中往往比 KMP 算法效率更高。:这也是一种高效的字符串匹配算法,它在匹配失败时,根据haystack中参与匹配的最末位字符的下一个字符来决定跳过的步数,实现简单且效率较好。遍历主字符串并检查子串匹配。

2025-07-20 19:54:25 381

原创 LC27 移除元素

解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。输入:nums = [0,1,2,2,3,0,4,2], val = 2。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。输出:5, nums = [0,1,4,0,3,_,_,_]输入:nums = [3,2,2,3], val = 3。输出:2, nums = [2,2,_,_]元素的顺序可能发生改变。

2025-06-02 15:29:28 432

原创 LC26 删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2。输入:nums = [0,0,1,1,1,2,2,3,3,4]

2025-06-02 15:29:10 428

原创 LC21 合并两个有序链表

若 list1 的节点值 ≤ list2 的节点值,将 list1 的当前节点链接到 current 后,并移动 list1 的指针。合并两个有序链表的经典方法是 ​​双指针迭代​​,通过比较两个链表的当前节点值,逐步将较小的节点链接到新链表中。​​双指针遍历​​ 通过比较节点值,逐步构建新链表。​​C 语言实现​​:直接操作指针,逻辑清晰,适合理解底层链表操作。​​虚拟头节点​​ 简化了链表头部的处理逻辑。是 ​​双指针迭代​​ 和 ​​虚拟头节点​​ 的应用。1.合并两个有序链表问题的。

2025-05-25 20:31:14 551

原创 LC20 有效的括号

括号匹配问题可以通过 ​​栈(Stack)​​ 这一数据结构高效解决。(1) 若栈为空,或栈顶元素不匹配,返回 false。给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。遍历结束后,若栈为空,说明所有括号正确闭合,返回 true;2.核心思路为:左括号入栈​​,​​右括号匹配栈顶​​。使用哈希表存储右括号到左括号的映射关系,简化条件判断,提高代码可读性。每个右括号都有一个对应的相同类型的左括号。​​左括号​​:直接压入栈中。左括号必须以正确的顺序闭合。

2025-05-25 20:00:28 323

空空如也

空空如也

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

TA关注的人

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