Skip to content
On this page

378. 有序矩阵中第 K 小的元素

原题链接:LeetCode 378. 有序矩阵中第 K 小的元素

题目描述

给你一个 n x n* *矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k不同 的元素。

你必须找到一个内存复杂度优于 O(n2) 的解决方案。

示例 1:

**输入:**matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8 **输出:**13 **解释:**矩阵中的元素为 [1,5,9,10,11,12,13,13,15],第 8 小元素是 13

示例 2:

**输入:**matrix = [[-5]], k = 1 输出:-5

提示:

- `n == matrix.length`

- `n == matrix[i].length`

- `1 <= n <= 300`

-109 <= matrix[i][j] <= 109
- 题目数据 **保证** `matrix` 中的所有行和列都按 **非递减顺序** 排列

1 <= k <= n2

进阶:

- 你能否用一个恒定的内存(即 `O(1)` 内存复杂度)来解决这个问题?

你能在 `O(n)` 的时间复杂度下解决这个问题吗?这个方法对于面试来说可能太超前了,但是你会发现阅读这篇文章( this paper )很有趣。

难度: Medium


题解代码

javascript
/**
 * @param {number[][]} matrix
 * @param {number} k
 * @return {number}
 */
// 内置堆
var kthSmallest = function(matrix, k) {
  const pq = new MinPriorityQueue({ 
    compare: (a, b) => matrix[a[0]][a[1]]  - matrix[b[0]][b[1]] 
  });
  const len = matrix[0].length
  const len1 = Math.min(matrix.length, k)

  for (let i = 0; i < len1; i++) {
    pq.enqueue([i, 0])
  }

  while (k-- >= 0 && pq.size()) {
    const [i, j] = pq.dequeue();
    if (!k) return matrix[i][j]
    if (j + 1 < len) pq.enqueue([i, j + 1]);
  }
};

技术文档集合