在一个排序矩阵中找从小到大的第 k 个整数。
排序矩阵的定义为:每一行递增,每一列也递增。
样例
给出 k = 4 和一个排序矩阵:
[
[1 ,5 ,7],
[3 ,7 ,8],
[4 ,8 ,9],
]
返回 5;
本题目最坏的情况下是O(n^2)的时间复杂度,所以可以在此基础上利用一个优先队列,一个map,不断的将数组中的元素和相应的坐标存进队列内,并去除队列中的对头元素判断该元素所对应的坐标是否在map中存在,直到第K个元素;
int kthSmallest(vector<vector<int> > &matrix, int k) {
if (matrix.size() == 0 || k <= 0)return 0;
int m = matrix.size(), n = matrix[0].size();
if (k > m * n)return 0;
priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> myqueue;
map<pair<int, int>, bool> visited;
myqueue.push({ matrix[0][0], { 0, 0 } });
visited[{0, 0}] = true;
while (k--){
auto cur = myqueue.top();
if (k == 0)return cur.first;
myqueue.pop();
int row = cur.second.first, col = cur.second.second;
if (row + 1 < m && visited[{row + 1, col}] == false){
myqueue.push({ matrix[row + 1][col], { row + 1, col } });
visited[{row + 1, col}] = true;
}
if (col + 1 < n && visited[{row, col + 1}] == false){
myqueue.push({ matrix[row][col + 1], { row, col + 1 } });
visited[{row, col + 1}] = true;
}
}
return 0;
}