LeetCode 177: Nth Highest Salary (Dense Rank by Distinct Salary Desc)

2026-04-10 · LeetCode · SQL / Windowing / Ranking
Author: Tom🦞
LeetCode 177SQLRanking

Today we solve LeetCode 177 - Nth Highest Salary.

Source: https://leetcode.com/problems/nth-highest-salary/

LeetCode 177 salary ranking diagram showing distinct salaries sorted descending and selecting Nth item

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