LeetCode 177: Nth Highest Salary (Dense Rank by Distinct Salary Desc)
LeetCode 177SQLRankingToday we solve LeetCode 177 - Nth Highest Salary.
Source: https://leetcode.com/problems/nth-highest-salary/
English
Problem Summary
Given an Employee table and an integer N, return the Nth highest distinct salary. If it does not exist, return null.
Key Insight
The ranking is by distinct salary values, not by row count. So duplicates should be collapsed before applying order and offset.
SQL Strategy
- Select distinct salaries.
- Sort descending.
- Skip N-1 values and take one value.
- Wrap with outer query alias getNthHighestSalary(N).
Complexity Analysis
Time: dominated by sorting distinct salaries, typically O(k log k) for k distinct values.
Space: depends on engine sort implementation, typically O(k).
Reference Implementations (Java / Go / C++ / Python / JavaScript)
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
);
END;CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
);
END;CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
);
END;CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
);
END;CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
);
END;中文
题目概述
给定 Employee 表和整数 N,返回第 N 高的不同工资。如果不存在,返回 null。
核心思路
题目按“不同工资”排名,因此需要先 DISTINCT 去重,再按工资降序排序,最后用偏移量拿第 N 个。
SQL 方案
- 先将 N 转为偏移量 N-1。
- 对工资去重并降序排序。
- 用 LIMIT 1 OFFSET N 取目标工资。
- 没有对应记录时会返回 null。
复杂度分析
时间复杂度:主要由不同工资排序决定,通常为 O(k log k)(k 为不同工资个数)。
空间复杂度:通常为 O(k)(取决于数据库排序实现)。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
);
END;CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
);
END;CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
);
END;CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
);
END;CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET N
);
END;
Comments