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.
method 1 pq
最容易想到的思路,使用优先队列,然后弹出k-1次,然后得到答案
int kthSmallest(vector<vector<int>>& matrix, int k) {
priority_queue<int> pq;
for (int i = 0; i < matrix.size(); i++)
{
for (int j = 0; j < matrix.size(); j++)
pq.push(matrix[i][j]);
}
int n = matrix.size() * matrix.size() - k + 1;
while (n-- > 1){
pq.pop();
}
return pq.top();
}
method 2 Binary Search
使用二分查找时,二分的标准是对序列的个数,而不是最小数和最大数之间的范围。
从右上角的元素开始查询,使第mid小的数,逐渐趋向于第k个数
//https://blog.csdn.net/wusuopubupt/article/details/12520223
//https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/discuss/85173/Share-my-thoughts-and-Clean-Java-Code
//range not scope
//计算比mid小/大的个数
int kthSmallest(vector<vector<int>>& matrix, int k) {
int low = matrix[0][0], high = matrix[matrix.size() - 1][matrix.size() - 1];
while (low < high){
int mid = low + (high - low) / 2;
int count = 0, j = matrix[0].size() - 1;
for (int i = 0; i < matrix.size(); i++)
{
while (j >= 0 && matrix[i][j] > mid) j--;
count += (j + 1);
}
if (count < k) low = mid + 1;
else high = mid;
}
return low;
}
summary
- 第K大/小,首先想到优先队列
- 使用二分查找,使第mid小的数,逐渐趋向于第k个数