问题描述
lintcode
笔记
- 使用了比较复杂的数据结构。
一个是priority_queue
,队列里的元素是pair<int, pair<int, int>>
,分别存放矩阵值,和矩阵坐标。 - 在循环中每次pop出来元素的最小值,然后把元素的最小值的“右边”和“下边”元素都入队。
priority_queue
自动就从小到大的顺序排好序了。。priority_queue
大法好! - 还有一些小细节要注意的是
- 要做一个visited的数组来记录是否访问过矩阵中的元素。
- memset的用法:void *memset(void *s,int c,size_t n),以s开头的n个数据初始化为c,我弄混了。。
代码
class Solution {
public:
int kthSmallest(vector<vector<int> > &matrix, int k) {
priority_queue<pair<int, pair<int, int> >, vector<pair<int, pair<int, int> > >, greater<pair<int, pair<int, int> > > > q;
const int m = matrix.size();
const int n = matrix[0].size();
bool visited[m][n];
memset(visited, 0, m*n);
q.push(make_pair(matrix[0][0], make_pair(0, 0)));
visited[0][0] = true;
while (k--)
{
pair<int, pair<int, int>> now = q.top();
int v = now.first;
int i = now.second.first;
int j = now.second.second;
if (k == 0)
return v;
q.pop();
if (i+1<m && !visited[i+1][j])
{
q.push(make_pair(matrix[i+1][j], make_pair(i+1, j)));
visited[i+1][j] = true;
}
if (j+1<n && !visited[i][j+1])
{
q.push(make_pair(matrix[i][j+1], make_pair(i, j+1)));
visited[i][j+1] = true;
}
}
}
};