初始化最大堆: 创建一个最大堆的优先队列,这使得队列中的元素按照降序排列。
遍历矩阵并更新队列: 通过嵌套的循环遍历二维矩阵中的每一个元素,将元素添加到最大堆中。
控制队列大小: 在添加元素后,检查队列的大小是否已经达到了k。如果已经达到,而且当前遍历到的元素大于队列中最大的元素,就可以提前结束遍历。因为矩阵是按行和列有序的,一旦超过第k小的元素,后面的元素肯定更大。同时,如果队列的大小超过了k,就从队列中移除最大的元素,以保持队列中仅有k个最小的元素。
返回结果: 最终返回最大堆中的最大元素,这就是矩阵中第k小的元素。
class Solution {
public int kthSmallest(int[][] matrix, int k) {
// 使用优先队列 保留K个最小的元素
// 使用最大堆 那么队列的元素都是降序排列 最大的元素在队头
PriorityQueue<Integer> MaxPQ = new PriorityQueue<>(Collections.reverseOrder());
for(int[] row:matrix){
for(int num: row){
// 如果队列已经满了 并且当前的元素大于队列中的最大元素 也就是队头 第k小元素
if(MaxPQ.size() == k && num > MaxPQ.peek()){
break;
}
MaxPQ.add(num);// 当前遍历的元素添加到优先队列中
// 如果队列元素超过K 移除队头元素
if(MaxPQ.size() > k){
MaxPQ.remove();
}
}
}
// 当把整个矩阵遍历完毕之后 队头元素就是当前队列最大元素 也就是第k小元素
return MaxPQ.remove();
}
}