LeetCode 570. 至少有5名直接下属的经理
题目描述


题意分析
Employee中每行是一名员工,id唯一标识员工,managerId指向他的直接经理。要求找出直接下属人数至少为五的经理,并输出姓名。只统计
managerId直接指向该经理的员工,不沿管理链统计间接下属,也不要求经理和下属属于同一部门。
解法:分组统计 + 连接查询
核心思路
[!blue]
同一张表分别起别名manager和report,代表经理与下属。通过report.managerId = manager.id自连接后,每条结果都对应一名下属及其直接经理;经理id唯一,所以同一名下属不会被重复连接。按
manager.id和manager.name分组,把同一经理对应的直接汇报关系放到一组,COUNT(*)就是人数。id用于区分身份,不能只按姓名分组,否则同名经理的下属会被合并。人数是聚合后才得到的结果,因此用
HAVING COUNT(*) >= 5筛选,最后只输出经理姓名。内连接已经排除了没有下属的经理,而他们本来也不可能达标;两个同名经理分别达标时,也应保留两条结果,不要对姓名去重。
解题步骤
- 为员工表指定经理、下属两个别名,按下属的
managerId连接经理的id。- 按经理身份及姓名分组,统计组内直接下属行数。
- 用
HAVING保留人数大于等于五的组。- 选择
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。 |
转载与许可
许可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!