先将第一列加入到最小堆中,然后取出队头元素,就是最小值,然后后面位置补过来,直到第k个数。
这里需要自定义优先队列规则
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
struct point {
int val, x, y;
point(int val, int x, int y) : val(val), x(x), y(y) {}
bool operator> (const point& a) const { return this->val > a.val; }
};
priority_queue<point, vector<point>, greater<point>> que;
int n = matrix.size();
for (int i = 0; i < n; i++) {
que.emplace(matrix[i][0], i, 0);
}
while (--k) {
point now = que.top();
que.pop();
if (now.y != n - 1) {
que.emplace(matrix[now.x][now.y + 1], now.x, now.y + 1);
}
}
return que.top().val;
}
};
lambda表达式写法:
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
auto cmp = [&matrix](const pair<int, int> & a, const pair<int, int> & b) {
return matrix[a.first][a.second] > matrix[b.first][b.second];
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> que(cmp);
int n = matrix.size();
for (int i = 0; i < n; i++) {
que.emplace(i, 0);
}
while (--k) {
auto [x, y] = que.top();
que.pop();
if (y != n - 1) {
que.emplace(x, y + 1);
}
}
auto [x, y] = que.top();
return matrix[x][y];
}
};