Skip to main content

181.工资高于经理的员工

标签: hash-table, sort

难度: Easy

通过率: 70.7%

原题链接: https://leetcode.com/problems/employees-earning-more-than-their-managers/description/

题目描述

给定一个Employee表,包含员工的id、名字、工资和经理的id。需要找出工资高于经理的员工姓名。返回的表中只需要包含员工姓名,顺序可以是任意的。

解题思路

我们需要找出那些工资高于其经理的员工。可以通过自连接(Employee表与自身连接)来实现这一点。为此,我们将Employee表看作两张表:一张代表员工,一张代表经理,通过比较员工的工资和其经理的工资,选出工资更高的员工。假设E1是员工,E2是E1的经理,当E1的工资高于E2的工资时,我们就选择E1的名字。具体SQL语句如下:

SELECT E1.name AS Employee
FROM Employee E1, Employee E2
WHERE E1.managerId = E2.id AND E1.salary > E2.salary;

代码实现

# Python version: 使用pandas模拟SQL查询。
import pandas as pd

# 假设Employee是一个DataFrame对象
def find_higher_salary_employees(Employee):
# 自连接DataFrame:employee E1和manager E2
df = Employee.merge(Employee, left_on='managerId', right_on='id', suffixes=('_employee', '_manager'))
# 过滤出工资高于经理的员工
result = df[df['salary_employee'] > df['salary_manager']]
# 只返回员工的名字
return result[['name_employee']]

# 示例使用
# Employee = pd.DataFrame({
# 'id': [1, 2, 3, 4],
# 'name': ['Joe', 'Henry', 'Sam', 'Max'],
# 'salary': [70000, 80000, 60000, 90000],
# 'managerId': [3, 4, None, None]
# })
# print(find_higher_salary_employees(Employee))

复杂度分析

时间复杂度:

如果你以SQL执行,上述查询的时间复杂度主要取决于表的大小和系统优化级别,通常认为是 O(nk)O(n \cdot k),其中nn是行数,kk是自连接的倍数。对于其他实现如在编程语言中的模拟,也为O(n)O(n),因为涉及两次遍历。

空间复杂度:

O(n)O(n),因为我们需要存储所有员工信息以进行比较。