Skip to content

Latest commit

 

History

History
61 lines (49 loc) · 1.28 KB

378.kth-smallest-element-in-a-sorted-matrix.md

File metadata and controls

61 lines (49 loc) · 1.28 KB

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

示例:

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

返回 13

说明:

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


多路归并

  1. 把每一行的开头元素加入最小优先队列;
  2. 每次弹出优先队列的队头,把当前行的下一个元素加入到优先队列
  3. 弹出 k-1 个元素时,队头元素就是第 k 大的数

Cpp

struct Node{
    int r;
    int c;
    int val;
    Node(int _r, int _c, int _v): r(_r), c(_c), val(_v){};
    bool friend operator <(const Node &n1, const Node &n2){
        return n1.val > n2.val;
    }
};
class Solution {
public:
    int kthSmallest(vector<vector<int>>& matrix, int k) {
        priority_queue<Node> q;
        for (int i = 0; i< matrix.size(); i++) q.push({i, 0, matrix[i][0]});
        while (k > 1){
            auto node = q.top();
            q.pop();
            k--;
            if (node.c < matrix[0].size()-1){
                q.push({node.r, node.c+1, matrix[node.r][node.c+1]});
            }
        }
        return q.top().val;
    }
};

Java

二分