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

示例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,

返回 13。

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

思路:此题类似于​​合并K个排序链表​​,因此可以使用相同的方法解决此题

class Solution {
public:
//本题类似于合并k个有序链表
int kthSmallest(vector<vector<int>>& matrix, int k) {
struct Point{
int val,row,col;
Point(int val,int row,int col):val(val),row(row),col(col){};
bool operator > (const Point& a) const{
return val>a.val;
}
};
priority_queue<Point,vector<Point>,greater<Point>> pq;
for(int i=0;i<matrix.size();i++){
//emplace直接构造类对象,并传入所需要的参数
pq.emplace(matrix[i][0],i,0);
}
for(int i=0;i<k-1;i++){
Point p=pq.top();
pq.pop();
if(p.col!=matrix.size()-1){
pq.emplace(matrix[p.row][p.col+1],p.row,p.col+1);
}
}
return pq.top().val;
}
};

对于比较大小的写法也可以用下面的方法

class Solution {
public:
//本题类似于合并k个有序链表
int kthSmallest(vector<vector<int>>& matrix, int k) {
struct Point{
int val,row,col;
Point(int val,int row,int col):val(val),row(row),col(col){};
};

struct cmp{
bool operator()(Point a,Point b){
return a.val>b.val;
}
};

priority_queue<Point,vector<Point>,cmp> pq;
for(int i=0;i<matrix.size();i++){
//emplace直接构造类对象,并传入所需要的参数
pq.emplace(matrix[i][0],i,0);
}
for(int i=0;i<k-1;i++){
Point p=pq.top();
pq.pop();
if(p.col!=matrix.size()-1){
pq.emplace(matrix[p.row][p.col+1],p.row,p.col+1);
}
}
return pq.top().val;
}
};