LeetCode_378 有序矩阵中第K小的元素

题目描述:
给定一个 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章