题目描述

✅ 570. 至少有5名直接下属的经理

image-20260929101150152

image-20260929101150263

题意分析

Employee 中每行是一名员工,id 唯一标识员工,managerId 指向他的直接经理。要求找出直接下属人数至少为五的经理,并输出姓名。

只统计 managerId 直接指向该经理的员工,不沿管理链统计间接下属,也不要求经理和下属属于同一部门。

解法:分组统计 + 连接查询

核心思路

[!blue]
同一张表分别起别名 manager 和 report,代表经理与下属。通过 report.managerId = manager.id 自连接后,每条结果都对应一名下属及其直接经理;经理 id 唯一,所以同一名下属不会被重复连接。

按 manager.id 和 manager.name 分组,把同一经理对应的直接汇报关系放到一组,COUNT(*) 就是人数。id 用于区分身份,不能只按姓名分组,否则同名经理的下属会被合并。

人数是聚合后才得到的结果,因此用 HAVING COUNT(*) >= 5 筛选,最后只输出经理姓名。内连接已经排除了没有下属的经理,而他们本来也不可能达标;两个同名经理分别达标时,也应保留两条结果,不要对姓名去重。

解题步骤

  1. 为员工表指定经理、下属两个别名,按下属的 managerId 连接经理的 id。
  2. 按经理身份及姓名分组,统计组内直接下属行数。
  3. 用 HAVING 保留人数大于等于五的组。
  4. 选择 manager.name 作为结果;题目允许任意顺序,无需排序。

代码实现

SELECT manager.name
FROM Employee AS manager
JOIN Employee AS report
-- 每行连接结果对应一条直接汇报关系。
ON report.managerId = manager.id
GROUP BY manager.id, manager.name
-- 聚合后筛选人数,恰好五名下属也应保留。
HAVING COUNT(*) >= 5;

复杂度分析

  • 时间复杂度:由连接与分组计划决定;哈希处理可线性,排序或索引访问需要相应成本。
  • 空间复杂度:连接与聚合状态通常按 $O(n)$ 上界估算。

关键点总结

[!green]

  • 从指向经理的员工行统计人数。
  • 直接关系只连接一次,不递归沿管理链传播。
  • 聚合筛选使用 HAVING,五人也要保留。

易错点总结

[!yellow]

  • 条件写成大于五:漏掉恰好五名下属。
  • 只按姓名分组:同名经理的人数被合并。
  • 按员工 id 分组:每组通常只剩一个员工。
  • 将 COUNT 放到同层 WHERE:聚合结果尚未产生。

相似题目

题目 难度 关联与区别
181. 超过经理收入的员工 简单 同样通过managerId关联同表员工记录,原题比较薪资,本题按经理累计直属下属数。
182. 查找重复的电子邮箱 简单 同样GROUP BY后用HAVING筛选频次,本题分组键是managerId且阈值为至少5。
转载与许可
作者
链接 https://hgnulb.github.io/blog/2021/70785052
许可 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!