给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
请注意,它是排序后的第k小元素,而不是第k个元素。
示例:
matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k = 8, 返回 13。
说明:
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。
解题方法:
使用优先队列,优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似于给队列里的元素进行了由大到小的顺序排序。
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
priority_queue<int> heap;//优先队列,默认是逆序
//将所有元素依次有条件的放入队列
for(auto &i : matrix){
for(auto &j : i){
//优先队列(堆)始终维持降序排序,请容量为k,堆头即为当前结果(第k大的元素)
if(heap.size()>=k){
//如果队列长度大于k,说明当前堆头可能不是最终结果
if(j < heap.top()){
//如果这个元素比堆头还小,说明这个元素排序在k前,则当前堆头必定不是最终结果
heap.pop();//堆头出队
heap.push(j);
}
}
else{
//堆中不足k个,则需要继续放入
heap.push(j);
}
}
}
return heap.top();//最后堆头即为第k大的元素
}
};