- 博客(63)
- 收藏
- 关注
原创 力扣Hot100--106.对称二叉树
明确概念:一棵树是对称的,当且仅当它的左子树和右子树是镜像对称的,所以判断是否是对称二叉树,其实就是判断根节点的左右孩子是否是翻转对称。要求:给你一个二叉树的根节点 root , 检查它是否轴对称。1、比较外侧:左子树的左节点 vs 右子树的右节点。2、比较内侧:左子树的右节点 vs 右子树的左节点。3、当前节点值必须相等。
2025-10-15 16:51:39
188
原创 力扣Hot100--226.翻转二叉树
2、交换该节点的左右子树:node.left, node.right = node.right, node.left。要求:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。1、从队列中取出当前节点(使用 popleft()确保先进先出)3、如果左子树不为空,将其加入队列(等待后续处理)4、如果右子树不为空,将其加入队列(等待后续处理)
2025-10-15 15:00:13
227
原创 力扣Hot100--104.二叉树的最大深度
1、二叉树的 高度 是指任意节点到叶子节点的距离(从下到上,用后序遍历)2、二叉树的 深度 是指任意节点到根节点的距离(从上到下,用前序遍历)二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。3、后序遍历得到的 根节点的高度 就是该二叉树的 最大深度。要求:给定一个二叉树 root ,返回其最大深度。一层一层找下去,比较好理解。
2025-10-14 17:46:29
300
原创 力扣Hot100--94.二叉树的中序遍历、144.二叉树的前序遍历、145.二叉树的后序遍历
【代码】力扣Hot100--94.二叉树的中序遍历。
2025-10-13 15:21:32
254
原创 力扣Hot100--21.合并两个有序链表
1、每次比较两个链表当前节点的值,将较小值接入结果链表。3、当一个链表遍历完后,直接将另一个链表的剩余部分接入。2、将已接入节点的链表指针后移一位。
2025-09-30 18:00:48
193
原创 力扣Hot100--141.环形链表
1、在遍历每个节点时,先检查它是否在集合中,然后再将其加入集合;记录所有访问过的节点,检查是否重复访问。空间复杂度O(1),时间复杂度O(n)2、如果遍历到链表末尾,说明无环。空间、时间复杂度都为O(n)也是快慢指针法,只是起点一样。
2025-09-30 17:53:06
292
原创 力扣Hot100--234.回文链表
判断的是内层递归的比较结果。在python中 mode_set[::-1] 表示将列表 vals反转了,所以也可以通过 mode_set==mode_set[::-1] 来判断是否是一个回文列表。这里要注意,那mode_set 就要保存节点的值,并非节点本身!空间复杂度:O(n),主要用于递归调用栈。时间复杂度:O(n),其中 n 是链表的长度。空间复杂度:O(n),需要额外空间存储所有节点值。时间复杂度:O(n),遍历链表一次,比较列表一次。空间复杂度是 O(1)
2025-09-22 18:35:48
516
1
原创 力扣Hot100--206.反转链表
反转指针,让 curr(节点1) 的 next指向 prev(None)。反转指针,让 curr(节点2) 的 next指向 prev(节点1)。此时链表状态: (节点3) -> (节点2) -> None,节点1还未被处理,仍指向 节点2。此时链表状态: (节点3) -> (节点2) -> (节点1) -> None。将 curr指针移动到之前保存的下一个节点,即节点2,准备处理下一个节点。保存 curr(节点1) 的下一个节点 (节点2),防止断链。保存 curr(节点2) 的下一个节点 (节点3)。
2025-09-19 17:42:29
1653
原创 【Leetcode】高频SQL基础题--185.部门工资前三高的所有员工
生成一个RankedEmployees临时表;DENSE_RANK()会处理并列情况(2、然后对临时表过滤出排名前三的员工。1、使用内连接将两表关联,使用。
2025-09-17 15:44:00
236
原创 【Leetcode】高频SQL基础题--585.2016年的投资
1、上述方法,每个子查询都会执行一次表扫描,然后主查询再执行一次扫描,总体效率较低。1、通过两个子查询分别处理tiv_2015重复性和城市唯一性条件。(如COUNT() OVER)来优化查询。2、然后用WHERE过滤出来。2、再次记录一下窗口函数。
2025-09-17 11:49:24
365
原创 【Leetcode】高频SQL基础题--602.好友申请II:谁有最多的好友
首先明确好友关系是双向的,一个人可以是请求者(发送请求并被接受),也可以是接受者(接受别人的请求)。因此,需要统计每个用户在 requester_id和 accepter_id列中出现的总次数,这个次数就是该用户的好友数量。两个子查询 requester_id和 accepter_id两列的数据,生成一个包含所有用户ID的临时表 combined_ids。由于(requester_id, accepter_id) 是这张表的主键(具有唯一值的列的组合),所以一个好友关系不可能被重复计算。
2025-09-16 18:30:36
288
原创 【Leetcode】高频SQL基础题--1321.餐馆营业额变化增长
即 生成一个临时表 windowed,包含三列:visited_on(日期)、total_amount(7 天窗口内的总消费)、day_count(窗口内的实际天数)。,包含两列:visited_on(日期)和 daily_amount(该日总消费)(即 day_count = 7),计算平均值并格式化输出。3、最后在主查询中从 windowed中过滤日期,只。4、按照按日期升序排序。
2025-09-16 18:15:35
228
原创 【Leetcode】高频SQL基础题--176.第二高的薪水
3、主查询 再从剩余的记录中找出最大值,这个值就是第二高的薪水。如果没有任何记录剩余(即所有薪水相同或只有一条记录),MAX()聚合函数会自动返回 NULL。SELECT MAX(salary) FROM Employee 找出 Employee 表中的最高薪水。2、然后用WHERE 子句进行过滤 用于排除所有等于最高薪水的记录,只保留那些薪水低于最高薪水的记录。
2025-09-16 14:54:19
154
原创 【Leetcode】高频SQL基础题--1327.查找拥有有效邮箱的用户
(‘c’),确保了邮箱域名 @leetcode.com的精确匹配(要求小写)1、用正则表达式,使用。
2025-09-11 18:30:52
287
原创 【Leetcode】高频SQL基础题--1327.列出指定时间段内所有的下单产品
(也就是 需要显式地在 GROUP BY中列出 product_name ,虽然在实际业务逻辑中,product_name确实由 product_id唯一决定(函数依赖),但有些数据库系统无法自动识别这种函数依赖关系。1、当时有个疑问,为什么 GROUP BY p.product_id, p.product_name,不可以只按照 p.product_id 进行分组吗?由于在标准的SQL语法中,SELECT语句中出现的所有非聚合列(没有使用SUM、COUNT等函数的列)
2025-09-11 18:01:57
254
原创 【Leetcode】高频SQL基础题--1484.按日期分组销售产品
• COUNT(DISTINCT product): 计算每个日期下不同产品的数量。将产品名称连接成字符串 (GROUP_CONCAT(…) AS products)。使用分组聚合,并为 products列使用专用于字符串聚合的聚合函数。• ORDER BY product: 按照产品名的词典顺序进行排序。是 MySQL 中专门用于将分组内的多行字符串值合并为一行的函数。计算出所需的两项结果(数量和不重复的产品列表)。来去重,避免同一天售卖的相同产品重复出现在字符串中。
2025-09-11 17:00:38
236
原创 【Leetcode】高频SQL基础题--196.删除重复的电子邮箱
1、数据库会先执行最内层的查询 SELECT MIN(id) AS min_id FROM Person GROUP BY email,得到一个包含所有需要保留的最小ID的结果集。2、然后将这个结果集物化为一个临时的、只在当前查询中存在的派生表,我们给它起名为 temp_table。1、使用自连接,对于每个电子邮件,如果存在更小的id(p1.id > p2.id),则删除当前id(p1)。外层DELETE语句不再直接查询原始表,而是查询这个临时出来的、结果集固定的“表”。
2025-09-11 16:07:29
373
原创 【Leetcode】高频SQL基础题--1527.患某种疾病的患者
1、存在两种情况:以“DIAB1”开头、包含“ DIAB1”的字符串(即代码中间或末尾有以“DIAB1”开头的代码,注意有空格)。
2025-09-11 13:55:12
285
原创 【Leetcode】高频SQL基础题--1667.修复表中的名字
1、将首字母变成大写,其余为小写,所以 left(name, 1) 得到 name 值的首字母、right(name, length(name) - 1)) 得到 name 值首字母余下的值。• RIGHT(str,length)从右开始截取字符串,length 是截取的长度。• UPPER(str)和 LOWER(str)分别用于将字符串转换为全大写或全小写。• LEFT(str,length)从左开始截取字符串,length 是截取的长度。3、最后根据 user_id 进行。
2025-09-11 10:16:09
257
原创 【Leetcode】高频SQL基础题--1341.电影评分
WHERE子句筛选出2020年2月1日至2020年2月29日之间的评分记录(注意条件是< ‘2020-03-01’,这是精准获取2月全月数据的推荐写法)。• 使用GROUP BY MovieRating.movie_id按电影ID分组,计算每部电影的平均评分(AVG(MovieRating.rating))。—当多个用户的评论次数相同时,按用户名升序排列,确保结果 deterministic(确定唯一用户)。2、查找2020年2月平均评分最高的电影(如果平均分相同,则按电影名字典序取第一个)。
2025-09-09 18:22:45
440
原创 【Leetcode】高频SQL基础题--626.换座位
1、对 id 进行判断:如果是偶数,那就和上面的值进行交换;如果是奇数并且不是最后一个数,那就和下面的值进行交换;最后就剩下是奇数并且是最后一个数,就不进行交换操作;LEAD(num, 1) OVER (ORDER BY id)会按id排序后,返回当前行num列的后一个值。2、CASE语句:可以在 WHEN子句中使用多个条件进行组合判断,并且多个WHEN子句要是不满足才走ELSE。LAG(num, 1) OVER (ORDER BY id)会按id排序后,返回当前行num列的前一个值。
2025-09-09 16:15:00
248
原创 【Leetcode】高频SQL基础题--1978.上级经理已离职的公司员工
让 e1.manager_id = e2.employee_id 将左表manager_id 与 employee_id 对应,就可以知道其上级经理是否是在职员工,不是在职员工的话 e2.employee_id is null;2、not in检查经理是否离职,如果某个员工的manager_id不在子查询返回的列表中,则说明该经理已离职(即不在当前员工表中)。• 如果manager_id为null,表示没有上级经理,自然不符合“上级经理已离职”的条件,会被过滤掉。2、上级经理已离职–>用。
2025-09-08 14:36:34
224
原创 【Leetcode】高频SQL基础题--1907.按分类统计薪水
1、通过三个独立的 SELECT语句,分别计算低收入(income < 20000)、中等收入(income BETWEEN 20000 AND 50000)和高收入(income > 50000)的账户数量。1、UNION运算符是合并多个查询结果的有效工具,默认会去除重复行。将这三个独立的查询结果垂直堆叠在一起,形成最终的三行结果(每行一个类别及其对应的数量)。2、三个SELECT 语句,也可以用WHERE进行条件过滤,然后再用COUNT 来统计数量。:使用UNION 和条件聚合。
2025-09-08 11:45:26
194
原创 【Leetcode】高频SQL基础题--1204.最后一个能进入巴士的人
要求:按上车顺序(turn)计算累计重量(Running Total),然后找出累计重量不超过 1000 千克的最后一个人。按上车顺序(turn)计算累计重量(Running Total),然后找出累计重量不超过 1000 千克的最后一个人。1、通过窗口函数按照 turn从小到大的顺序,逐行计算体重的累计和。该子查询会生成一个包含每个人姓名、顺序以及到此人为止的总重量的临时结果集t。2、从临时结果集t中,筛选出累计重量没有超过巴士负载限制(1000千克)的记录。
2025-09-08 10:54:16
261
原创 【Leetcode】高频SQL基础题--1164.指定日期的产品价格
3、使用 左连接left join 将两个查询联合。使用ifnull(p2.new_price, 10)如果产品没有价格,说明没有修改过,设置为 10,如果有价格,设置为最新的价格。找到 2019-08-16 前所有有改动的产品及其最新价格,如果没有更新那就是原始价格。2、子查询:再找到所有 2019-08-16 前有修改的产品和他们最新的价格;1、子查询:先找到所有的产品;
2025-09-07 15:13:56
221
原创 【Leetcode】高频SQL基础题--180.连续出现的数字
(num, 1) OVER (ORDER BY id)获取当前行的后一个num值。ORDER BY id确保按id顺序处理行。来获取当前行的前一个和后一个num值,然后检查这三个值是否相同。如果相同,则表示当前行是连续三个相同数字的中间行。(num, 1) OVER (ORDER BY id)获取当前行的前一个num值,使用。,确保每个数字只输出一次。不熟悉窗口函数,难!
2025-09-05 18:16:17
221
原创 【Leetcode】高频SQL基础题--1789.员工的直属部门
• 使用子查询找出所有部门数量为1的员工(HAVING COUNT(department_id) = 1),然后通过 employee_id IN条件将这些员工的记录也包括进来,即使它们的 primary_flag是 ‘N’。• 直接筛选 primary_flag = 'Y’的记录:这部分确保所有明确标记为直属部门的记录被选中。还有用窗口函数、UNION的解法。
2025-09-05 14:23:26
264
原创 【Leetcode】高频SQL基础题--1731.每位经理的下属员工数量
我想过加判断:使用 LEFT JOIN来匹配员工和他们的下属,然后通过过滤条件(reports_count = 0, average_age IS NULL)来移除那些不是经理的员工。1、一开始我选择用左连接,通过employee_id和reports_to匹配,然后但是左连接会保留左表的所有记录,即所有经理,即使用户的代码中可能没有下属的员工也会被包括进来。• COUNT(E2.employee_id):统计该经理名下有多少条汇报记录,即下属人数 (reports_count)。
2025-09-05 11:16:33
289
原创 【Leetcode】高频SQL基础题--1045.买下所有产品的客户
(SELECT COUNT(*) FROM Product) 计算Product表中的总产品数量。3、COUNT(DISTINCT product_key) 计算每个客户购买的唯一产品数量(2、GROUP BY customer_id 按客户。过滤出那些购买唯一产品数量等于总产品数量的客户。,统计每个客户的购买记录。
2025-09-04 16:56:49
267
原创 【Leetcode】高频SQL基础题--619.只出现一次的最大数字
1、直接在 GROUP BY 后使用 HAVING 过滤,然后对每个分组应用 MAX。但 MAX 在这里实际上只作用于每个分组内的单个数字(因为每个分组只有一个 num 值),所以 MAX 是多余的,2、更关键的是,当没有分组时,整个查询返回空。而题目明确要求在这种情况下返回 null。如果子查询为空(即没有单一数字),MAX 函数会自然返回 null。2、然后在外层应用 MAX 函数。1、使用子查询先过滤出单一数字;
2025-09-04 11:06:20
166
原创 【Leetcode】高频SQL基础题--1729.求关注者的数量
3、最后按照 user_id 排序。2、用COUNT 统计关注者数量。1、按照user_id 分组。
2025-09-04 10:32:32
241
原创 【Leetcode】高频SQL基础题--596. 超过 5 名学生的课
2、用 HAVING 过滤学生数量大于等于5个的班级。1、按照 班级 分组。
2025-09-04 10:18:58
288
原创 【Leetcode】高频SQL基础题--1084.销售分析III
来过滤每个产品的最早销售日期(MIN(s.sale_date))不早于 ‘2019-01-01’,且最晚销售日期(MAX(s.sale_date))不晚于 ‘2019-03-31’。这确保了所有销售都在春季范围内。1、用内连接来保留有销售记录的产品,左连接的话,就包括所有产品了,而题目指出产品必须有销售记录;• 至少有一次销售在2019年春季(2019-01-01 至 2019-03-31)内。• 没有任何销售在2019年春季之外(即所有销售都在春季内)。来确保只考虑有销售记录的产品。
2025-09-03 15:56:21
220
原创 【Leetcode】高频SQL基础题--1141.查询近30天活跃用户数
1、先用 HWHERE 过滤,只处理2019-06-28至2019-07-27之间的记录;3、最后使用COUNT(DISTINCT user_id)统计每日唯一用户数。1、如何表示时间范围:2019-06-28至2019-07-27。2、然后按照 activity_date 进行分组;
2025-09-03 14:19:55
219
原创 【Leetcode】高频SQL基础题--2356.每位教授所教授的科目种类
2、然后在每个老师分组内,统计不同的科目ID数量:COUNT(DISTINCT subject_id)1、按照 teacher_id 进行分组,这样每组包含该老师的所有授课记录;DISTINCT—>去重,用于返回唯一不同的值。确保同一科目只计数一次。
2025-09-03 10:37:24
214
原创 【Leetcode】高频SQL基础题--550.游戏玩法分析IV
2、第二天登录 (DATEDIFF(A2.event_date, A1.event_date) = 1)分子:COUNT(DISTINCT A2.player_id) - 有第二天登录的玩家数量。分母:COUNT(DISTINCT A1.player_id) - 总玩家数量。1、相同玩家 (A1.player_id = A2.player_id)1、获取每个玩家的首次登录日期(子查询 A1)。的玩家,A2会有对应记录;使用左连接确保保留所有玩家的首次登录记录。2、左连接查找第二天登录的记录。
2025-09-02 18:25:49
486
原创 【Leetcode】高频SQL基础题--1174.即时食物配送2
语句检查每个首次订单是否是即时订单:如果 order_date 等于 customer_pref_delivery_date,则返回1,否则返回0。(order_date) 找到每个顾客的首次订单日期。结果集包含每个 customer_id 和对应的 first_order_date。4.结果返回一个名为 immediate_percentage 的列,表示即时订单在首次订单中的百分比。(*) 或者 COUNT(customer_id)计算总首次订单数(即顾客数)。1、先用子查询,使用。
2025-09-02 15:51:05
334
原创 【Leetcode】高频SQL基础题--1193.每月交易
1、DATE_FORMAT(date, format):用于以不同的格式显示日期/时间数据。date 参数是合法的日期,format 规定日期/时间的输出格式。----> 年月 %Y-%m 输出。函数将trans_date转换为“年-月”格式(如’2018-12’),以便按月分组。4、使用COUNT(*)计算总交易数,SUM(amount)计算总金额。语句在SUM函数中条件性地计算批准交易的数量和金额。1、根据题目要求应该根据月份以及国家/地区进行。
2025-09-01 17:27:45
234
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅