題目描述:
給定一個 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;
}
};