题目:Kth Smallest Element in a Sorted Matrix
原题链接:https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix.
Note that it is the kth smallest element in the sorted order, not the kth distinct element.
Example:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,
return 13.
Note:
You may assume k is always valid, 1 ≤ k ≤ n2.
给定一个n * n 矩阵,保证每行、每列都是递增顺序,找出矩阵所有元素中第 k 小的元素。题目保证 k 是合法的。
例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8, 那么第8小的元素就是13.
和找一维数组中第 k 小的元素类似,只不过这次换成了二维数组,不过思想还是差不多的。
可以用二分的思想来解决,初始选择矩阵的左上角和右下角的元素作为下限 low 和上限 high ,取它们的平均值mid,然后按照每一行扫描数组,累计不大于mid的所有元素的个数,然后和 k 比较,如果比 k 大,那么令 high = mid, 否则令 low = mid + 1,循环一直到low >= high停止,这个时候 low 的值就是第 k 小的元素。
代码如下:
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
int len = matrix.size();
int low = matrix[0][0], high = matrix[len - 1][len - 1];
while(low < high) {
int mid = (low + high) >> 1;
int cou = 0, j = len - 1;
for (int i = 0; i < len; ++i) {
while(j >= 0 && matrix[i][j] > mid) j--;
cou += j + 1;
}
if (cou < k) {
low = mid + 1;
} else {
high = mid;
}
}
return low;
}
};