401-排序矩阵中的从小到大第k个数
在一个排序矩阵中找从小到大的第 k 个整数。
排序矩阵的定义为:每一行递增,每一列也递增。样例
给出 k = 4 和一个排序矩阵:
[
[1 ,5 ,7],
[3 ,7 ,8],
[4 ,8 ,9],
]
返回 5。挑战
使用O(k log n)的方法,n为矩阵的宽度和高度中的最大值。
标签
堆 优先队列 矩阵
思路
利用类似于小顶堆的方法,将排序矩阵 matrix 化为小顶堆,即 matrix[0][0] 为矩阵中最小元素,且矩阵每一行递增,每一列也递增,在取出堆顶元素后,将堆顶元素化为最大值 INT_MAX,然后调整矩阵,使其符合小顶堆定义。如此一来,取出的第 k 个元素即排序矩阵中的从小到大第k个数
code
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 sizeRow = matrix.size();
if (sizeRow <= 0) {
return 0;
}
int sizeCol = matrix[0].size();
if (sizeCol <= 0) {
return 0;
}
int min = 0;
for (int i = 0; i < k; i++) {
min = matrix[0][0];
matrix[0][0] = INT_MAX;
adjustMatrix(matrix);
}
return min;
}
void adjustMatrix(vector<vector<int> > &matrix) {
int row = 0, col = 0;
while (row < matrix.size() - 1 && col < matrix[0].size() - 1) {
if (matrix[row][col + 1] <= matrix[row + 1][col]) {
swap(matrix[row][col + 1], matrix[row][col]);
col++;
}
else if (matrix[row][col + 1] >= matrix[row + 1][col]) {
swap(matrix[row + 1][col], matrix[row][col]);
row++;
}
}
while (row == matrix.size() - 1 && col < matrix[0].size() - 1) {
if (matrix[row][col] >= matrix[row][col + 1]) {
swap(matrix[row][col + 1], matrix[row][col]);
col++;
}
}
while (col == matrix[0].size() - 1 && row < matrix.size() - 1) {
if (matrix[row][col] >= matrix[row + 1][col]) {
swap(matrix[row + 1][col], matrix[row][col]);
row++;
}
}
}
};