在一个排序矩阵中找从小到大的第 k 个整数。
排序矩阵的定义为:每一行递增,每一列也递增。
您在真实的面试中是否遇到过这个题? Yes
样例
给出 k = 4
和一个排序矩阵:
[
[1 ,5 ,7],
[3 ,7 ,8],
[4 ,8 ,9],
]
返回 5
。
挑战
使用O(k log n)的方法,n为矩阵的宽度和高度中的最大值。
标签
Expand
相关题目
Expand
分析:一般这种题都是用一个最大/最小堆,每次取出其中最大/最小的一个,然后把和这个数相关的(比它大/小)数压入堆中,知道找到第k大/小。
代码:
class Solution {
public:
/**
* @param matrix: a matrix of integers
* @param k: an integer
* @return: the kth smallest number in the matrix
*/
int kthSmallest(vector<vector<int> > &matrix, int k) {
// write your code here
int n = matrix.size();
int m = matrix[0].size();
priority_queue<pair<int,pair<int,int> >,vector<pair<int,pair<int,int> > >,greater<pair<int,pair<int,int>> >> q;
map<pair<int,int>,bool> visited;
q.push(make_pair(matrix[0][0],make_pair(0,0)));
visited[make_pair(0,0)]=true;
while(k--)
{
pair<int,pair<int,int> > cur = q.top();
if(k==0)
return cur.first;
q.pop();
if(cur.second.first+1<n&&visited[make_pair(cur.second.first+1,cur.second.second)]==false)
{
q.push(make_pair(matrix[cur.second.first+1][cur.second.second],make_pair(cur.second.first+1,cur.second.second)));
visited[make_pair(cur.second.first+1,cur.second.second)]=true;
}
if(cur.second.second+1<m&&visited[make_pair(cur.second.first,cur.second.second+1)]==false)
{
q.push(make_pair(matrix[cur.second.first][cur.second.second+1],make_pair(cur.second.first,cur.second.second+1)));
visited[make_pair(cur.second.first,cur.second.second+1)]=true;
}
}
}
};