378 有序矩阵中第k小的元素

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

示例:

1
2
3
4
5
6
7
8
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,

返回 13。

说明:

1
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public int kthSmallest(int[][] matrix, int k) {
if (k < 0 || k > matrix.length * matrix[0].length) {
return -1;
}
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());

for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (maxHeap.size() < k) {
maxHeap.offer(matrix[i][j]);
} else {
if (maxHeap.peek() > matrix[i][j]) {
maxHeap.poll();
maxHeap.offer(matrix[i][j]);
}
}
}
}
return maxHeap.peek();
}

思路:

1
维护一个最大堆,大小为k,即maxHeap.poll()为第k小的元素