给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是排序后的第 k 小元素,而不是第 k 个元素。
示例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,
返回 13。
说明:
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。
- 把每一行的开头元素加入最小优先队列;
- 每次弹出优先队列的队头,把当前行的下一个元素加入到优先队列
- 弹出 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