Appearance
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.lengthn ==matrix[i].length1 <= 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]);
}
};