Watch 10 video solutions for Department Top Three Salaries, a hard level problem involving Database. This walkthrough by Frederik Müller has 15,937 views views. Want to try solving it yourself? Practice on FleetCode or read the detailed text solution.
Table: Employee
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| id | int |
| name | varchar |
| salary | int |
| departmentId | int |
+--------------+---------+
id is the primary key (column with unique values) for this table.
departmentId is a foreign key (reference column) of the ID from the Department table.
Each row of this table indicates the ID, name, and salary of an employee. It also contains the ID of their department.
Table: Department
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | +-------------+---------+ id is the primary key (column with unique values) for this table. Each row of this table indicates the ID of a department and its name.
A company's executives are interested in seeing who earns the most money in each of the company's departments. A high earner in a department is an employee who has a salary in the top three unique salaries for that department.
Write a solution to find the employees who are high earners in each of the departments.
Return the result table in any order.
The result format is in the following example.
Example 1:
Input: Employee table: +----+-------+--------+--------------+ | id | name | salary | departmentId | +----+-------+--------+--------------+ | 1 | Joe | 85000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | | 5 | Janet | 69000 | 1 | | 6 | Randy | 85000 | 1 | | 7 | Will | 70000 | 1 | +----+-------+--------+--------------+ Department table: +----+-------+ | id | name | +----+-------+ | 1 | IT | | 2 | Sales | +----+-------+ Output: +------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Max | 90000 | | IT | Joe | 85000 | | IT | Randy | 85000 | | IT | Will | 70000 | | Sales | Henry | 80000 | | Sales | Sam | 60000 | +------------+----------+--------+ Explanation: In the IT department: - Max earns the highest unique salary - Both Randy and Joe earn the second-highest unique salary - Will earns the third-highest unique salary In the Sales department: - Henry earns the highest salary - Sam earns the second-highest salary - There is no third-highest salary as there are only two employees
Constraints:
Problem Overview: You are given employee salary records and department information. The task is to return employees whose salary ranks in the top three distinct salaries within their department. Multiple employees can share the same salary, so ranking must behave like DENSE_RANK rather than a simple top-three list.
Approach 1: SQL-like Grouping and Filtering (O(n log n) time, O(n) space)
This method mirrors how you would solve the problem in SQL using GROUP BY and ranking. First, group employees by department using a dictionary or map. Inside each group, collect the distinct salary values and sort them in descending order. The third highest distinct salary becomes the threshold for that department. Finally, iterate through the employees again and select those whose salary is greater than or equal to this threshold.
The key insight is separating salary ranking from employee filtering. You compute the top three distinct salaries first, then match employees against that set. Sorting each department’s salaries dominates the runtime, resulting in O(n log n) time overall with O(n) extra space for grouped data. This approach closely reflects database logic and is easy to implement in Python or JavaScript using maps and arrays. It heavily relies on concepts similar to hash maps and database grouping.
Approach 2: Using Data Structures and Sorting (O(n log n) time, O(n) space)
Another practical solution groups employees by department and sorts employees within each department by salary in descending order. While scanning the sorted list, track the number of distinct salary levels encountered. Each time the salary value changes, increase the rank counter. Continue collecting employees until the rank exceeds three.
This approach avoids building a separate salary set because the sorting order naturally exposes salary ranks. A simple loop maintains the current rank and ensures employees tied with the same salary share the same position. Sorting each department’s employee list drives the complexity to O(n log n) time with O(n) space for grouping. It’s straightforward to implement in Java using collections and comparators and relies on standard sorting techniques.
Recommended for interviews: The grouping plus ranking approach is what most interviewers expect. It shows you understand how to partition data by department and handle duplicate salaries correctly using dense ranking. A brute-force scan of every employee against all others demonstrates the idea but scales poorly. The grouped sorting or SQL-style ranking solution clearly communicates both algorithmic thinking and familiarity with real-world database queries.
| Approach | Time | Space | When to Use |
|---|---|---|---|
| SQL-like Grouping and Filtering | O(n log n) | O(n) | Best when modeling the problem like a SQL query with department grouping and salary ranking |
| Data Structures with Sorting per Department | O(n log n) | O(n) | Useful when implementing in languages like Java using collections and sorted lists |