- 博客(22)
- 收藏
- 关注
原创 从前序与中序遍历序列构造二叉树和从中序与后序遍历序列构造二叉树
后序遍历的根节点在末尾,而前序遍历的根节点在开头。通过前序遍历确定根节点(第一个元素),在中序遍历中找到该根节点的位置,其左侧为左子树的中序遍历结果,右侧为右子树的中序遍历结果。根据左子树的节点数量,可以从前序遍历中划分出对应的左子树和右子树的前序遍历序列。通过后序遍历确定根节点(最后一个元素),在中序遍历中找到该根节点的位置,其左侧为左子树的中序遍历结果,右侧为右子树的中序遍历结果。根据左子树的节点数量,可以在后序遍历中划分出对应的左子树和右子树的后序遍历序列。是同一棵树的后序遍历,请你构造并返回这颗。
2025-12-07 23:08:16
313
原创 颠倒二进制位和位1的个数
位运算的核心是“掩码 + 移位”,只要先把问题规模定死(32 位),就能用循环把任何位级操作变成常量时间的机械搬位,既练编码又加深对补码、大小端无关性的理解。把 32 位无符号整数看成固定长度的位串,逐位“头尾对调”——每次把原数最低位抠下来,拼到结果的最高位,循环 32 次即可。利用 n & (n-1) 打掉最低位 1 的特性,循环一次计数一次,直到 n 变 0,统计次数即得汉明重量,比逐位扫描更快。,编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数(也被称为。
2025-12-01 22:06:04
370
原创 第二高的薪水和第N高的薪水
首先在子查询中使用DENSE_RANK() OVER (ORDER BY salary DESC)为所有薪水分配排名,按薪水降序排列并为每个不同的薪水值分配连续的排名编号,相同薪水会获得相同排名且不会跳过后续编号;通过这道题我学到了几个重要的SQL技巧,首先是LIMIT和OFFSET的配合使用,OFFSET用于跳过指定数量的记录,LIMIT用于限制返回的记录数,这种组合非常适合处理分页和排名类问题;其次是子查询的妙用,将查询结果作为列值返回,可以处理可能为空的情况;id 是该表的主键(列中的值互不相同)。
2025-11-23 22:51:18
873
原创 环形链表和二叉树的前序遍历
然后调用递归辅助函数 preorder,该函数按照根-左-右的顺序访问每个节点,将节点值存入结果数组,并通过指针 resSize 记录当前数组索引。并注意了,这里预设2000的固定数组大小,在实际应用中更好的做法是动态计算树节点数量来确定数组大小,或者使用动态扩容策略。递归方法的时间复杂度是O(n),空间复杂度在最坏情况下(链表状的树)为O(n),平均情况下为O(log n)。学到了快慢指针法是解决链表环检测问题的经典方案,其核心思想是利用不同速度的指针在环状结构中的相对运动特性。,判断链表中是否有环。
2025-11-16 22:27:38
493
原创 路径总和和买卖股票的最佳时机
这个问题的核心在于找到买入和卖出的最佳时机,要求卖出必须在买入之后。从根节点开始,每次递归时用当前目标和减去当前节点的值,得到剩余的目标和。这种方法的精髓在于将大问题分解为小问题,判断整棵树是否存在路径和等于目标值,转化为判断左右子树是否存在路径和等于目标值-当前节点值。空间复杂度为O(h),取决于递归栈的深度,即树的高度。在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。由于树是空的,所以不存在根节点到叶子节点的路径。
2025-11-09 15:10:58
755
原创 平衡二叉树和二叉树的最小深度
本题要求二叉树的最小深度,即从根节点到最近叶子节点的最短路径节点数。关键在于最小深度的定义——必须到达无子节点的节点。通过此题加深了对二叉树深度概念的理解,特别是最小深度与最大深度的计算差异。这道题训练了树问题的分析和分解能力,以及递归思维的运用。平衡二叉树的判断需要同时满足两个条件:每个节点的左右子树高度差不超过1,且左右子树本身也都是平衡的。可以采用递归的后序遍历方法,在计算每个节点高度的同时检查其平衡状态。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。叶子节点是指没有子节点的节点。
2025-11-02 17:12:19
391
原创 二叉树的最大深度和将有序数组转化为二叉搜索树
利用数组已排序的特性,采用分治策略,每次选取数组的中间元素作为当前子树的根节点,这样能保证左右子树的节点数量基本相等,从而实现高度平衡。基于树结构的递归特性,当前树的最大深度完全由其左右子树的最大深度决定——只需分别获取左右子树的深度,取其中较大值并加一,即可自然推导出整棵树的深度。通过这道题,我深刻体会到递归思想在树结构问题中的精妙运用——将复杂问题分解为相似的子问题,通过定义好基准情形和递归关系,就能用简洁的代码解决看似复杂的问题。[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
2025-10-26 19:47:03
269
原创 删除重复的电子邮件和上升的温度
利用自连接来比较同一张表中的记录,通过连接条件找出所有重复的邮箱,然后通过 id 的大小比较来识别并删除那些"非最小id"的重复记录。通过将同一张天气表进行自连接,并使用DATEDIFF(w1.recordDate, w2.recordDate) = 1这个条件精准地将每个日期与其前一天配对,然后直接比较相邻两天的温度值,从而找出所有温度比前一天更高的日期ID。解题的关键在于理解自连接的本质——它让我们能在同一张表内进行数据比较,通过p1.id > p2.id这个巧妙条件精准锁定要删除的目标。
2025-10-17 23:08:48
519
原创 组合两个表和从不订购的客户
这样Customers表中那些ID不在订单客户ID集合里的记录,就是从未下过订单的客户。学会了如何处理数据缺失情况,确保主表数据完整性的同时优雅地处理关联表数据缺失的问题。学到了DISTINCT在子查询中去重的重要性,以及这种方法的适用边界——适合数据量不大、逻辑清晰的场景。该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。该表的每一行都表示订单的 ID 和订购该订单的客户的 ID。该表包含一些人的 ID 和他们的姓和名的信息。该表的每一行都表示客户的 ID 和名称。
2025-10-09 22:20:11
783
原创 超过经理收入的员工和查找重复的电子邮箱
需要比较每个员工与其直接经理的工资,员工和经理信息都在同一个表中,通过ManagerId字段建立员工与经理的关联,员工的经理ID(a.ManagerId)等于经理的ID(b.Id),比较员工工资与经理工资a.Salary > b.Salary,只返回符合条件的员工姓名。明白了SQL中"自连接" 的妙用,使用自连接技术来解决层级数据比较问题,通过将同一张员工表分别视为员工和经理两个角色,建立员工与经理的关联关系再筛选,这种模式高效地解决了同一表内不同层级数据间的比较需求。此表的每一行都包含一封电子邮件。
2025-09-29 13:15:00
919
原创 验证回文串和只出现一次的数字
其中 n 是 s 的长度。如果 s[i] 既不是字母也不是数字,右移左指针,也就是把 i 加一。否则,如果 s[i] 和 s[j] 转成小写后相等,那么把 i 加一,把 j 减一,继续判断。否则,s 不是回文串,返回 false。设整型数组 nums 中出现一次的数字为 x ,出现两次的数字为 a,a,b,b,... ,即:nums=[a,a,b,b,...,x]。因此,若将 nums 中所有数字执行异或运算,留下的结果则为 出现一次的数字 x ,即:a⊕a⊕b⊕b⊕...⊕x=0⊕0⊕...⊕x=x。
2025-09-20 23:01:14
307
原创 杨辉三角和杨辉三角II
使用滚动数组的思想,只使用一个一维数组就能计算出杨辉三角的指定行。利用杨辉三角的性质:每个数等于它上方两数之和,使用一维数组和滚动计算的方式,节省空间,从后往前更新数组元素,避免使用额外空间。设要计算的二维数组是 a,计算方法如下:每一排的第一个数和最后一个数都是 1,即 a[i][0]=a[i][i]=1。其余数字,等于左上方的数,加上正上方的数,即 a[i][j]=a[i−1][j−1]+a[i−1][j]。在「杨辉三角」中,每个数是它左上方和右上方的数的和。,返回「杨辉三角」的第。
2025-09-12 22:55:15
418
原创 相同的树和对称二叉树
分都为空、其中一个为空、都不为空三种情况讨论,解决相同的树问题。如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。利用相同的树用过的方法:分三种情况讨论,结合对称性解决问题。,编写一个函数来检验这两棵树是否相同。锻炼了思维方式,学到了更多的技巧。
2025-08-24 20:41:24
318
原创 合并两个有序数组和二叉树的中序遍历
采用递归,首先需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。所以,总共需要创建三个指针,两个指针用于指向 ums1 和 nums2 的初始化元素数量的末位,也就是分别指向 m−1 和 n−1 的位置,还有一个指针,指向 nums1 数组末位即可。,5,6] ,其中斜体加粗标注的为 nums1 中的元素。需要合并 [1,2,3] 和 [2,5,6]。需要合并的数组是 [] 和 [1]。
2025-08-17 23:04:10
269
原创 爬楼梯和删除排序链表中的重复元素
设爬到第 x 级台阶的方案数为 f(x) ,可得f(x)=f(x−1)+f(x−2)。你有多少种不同的方法可以爬到楼顶呢?删除所有重复的元素,使每个元素只出现一次。对链表进行一次遍历,来删除重复的元素。1. 1 阶 + 1 阶 + 1 阶。锻炼了思维方式,学到了更多的技巧。二、 删除排序链表中的重复元素。给定一个已排序的链表的头。有两种方法可以爬到楼顶。1. 1 阶 + 1 阶。有三种方法可以爬到楼顶。2. 1 阶 + 2 阶。3. 2 阶 + 1 阶。
2025-08-10 21:07:52
121
原创 二进制求和和 x 的平方根
8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。从a和b数组的最后依次相加储存在数组中,最后反转字符串。不允许使用任何内置指数函数和算符,例如。,以二进制字符串的形式返回它们的和。锻炼了思维方式,学到了更多的技巧。由于返回类型是整数,结果只保留。给你两个二进制字符串。利用数学计算暴力解题。
2025-08-03 20:09:31
291
原创 最后一个单词的长度和加一
单词最后一个字母的下标,也就是最后一个非空格字符的下标,记作 i。单词第一个字母的下标,我们可以找到在 i 左边的最近空格的下标,记作 j,那么 j+1 就是这个单词的第一个字母的下标。3.[9,9,9] 需开辟一个新数组,长度为digitsSize+1,元素全部置0,再将首元素置1 [1,0,0,0]。2.[1,9,9,9] 为9就置0,再将前个加一(其实跟1.一样) [2,0,0,0]。1.[1,2,9] 最后一个元素置0,再将前个元素加一 [1,3,0]。因此,结果应该是 [4,3,2,2]。
2025-07-27 13:15:00
298
原创 找出字符串中第一个匹配项的下标和搜索插入位置
如果 haystack 比 needle 短,直接返回 -1。如果 needle 的所有字符都匹配,返回当前起始位置。给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。"leeto" 没有在 "leetcode" 中出现,所以返回 -1。字符串的第一个匹配项的下标(下标从 0 开始)。第一个匹配项的下标是 0 ,所以返回 0。"sad" 在下标 0 和 6 处匹配。一、找出字符串中第一个匹配项的下标。练习了指针和二分法的使用。
2025-07-19 19:40:47
398
原创 删除有序数组中的重复项和移除元素
nums[fast−1],说明 nums[fast] 和之前的元素都不同,因此将 nums[fast] 的值复制到 nums[slow],然后将 slow 的值加 1,即指向下一个位置。如果右指针指向的元素不等于 val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;遍历结束之后,从 nums[0] 到 nums[slow−1] 的每个元素都不相同且包含原数组中的每个不同的元素,因此新的长度即为 slow,返回 slow。,返回删除后数组的新长度。
2025-06-02 20:27:57
398
原创 有效的括号和合并两个有序链表
当遇到左括号时,将符号存储在一个字符数组内,并将标志符号后移一位当遇到右括号时,比较在该符号前面,没有被比较过的符号进行判断如果是匹配的,则将字符数组的标识位前移,表示当前正在等待匹配的左侧括号符号,如果不比配直接输出false 由于s最长10000位,当被记录到的左括号超过5000时一定不匹配 当遍历s后,检查标志符号在哪里(或者说当前是否有等待匹配的符号)如果是-1则表示全部正确匹配。3.如果list1的值小于list2,比较list1的next值和list2,并把值赋给list1的下一个;
2025-05-25 19:39:28
315
原创 罗马数字转整数和最长公共前缀
将输入的每个字符视作一个单独的值,累加每个字符对应的数值。如果出现小的数字在大的数字的左边的情况,根据规则需要减去小的数字。即一个数字右侧的数字比它大,则将该数字的符号取反。依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。通常情况下,罗马数字中小的数字在大的数字的右边。给定一个罗马数字,将其转换成整数。,即为两个并列的 1。
2025-05-18 19:22:38
352
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅