题干
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
请注意,它是排序后的第k小元素,而不是第k个元素。
示例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,
返回 13。
说明:
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。
想法
最小堆,遍历每一层的数然后放到最小堆
堆顶弹出 接着遍历第二行
第k次弹出就是
2.非常规的二分法
若采用Binary Search, 先猜一个值,这个值是由最小值matrix[0][0]和最大值matrix[n-1][n-1]求mid得来.
然后算下小于等于这个mid的matrix元素个数,若是个数小于k, 就在mid到最大值之间再猜一个新的mid. 直到l 不再小于 r.
Time Complexity: O(nlog(matrix[n-1][n-1] - matrix[0][0])), 每次lowerThanMidCount用时O(n).
Space: O(1).
Java代码
public class Solution {
public int kthSmallest(int[][] matrix, int k) {
int n = matrix.length;
int l = matrix[0][0];
int r = matrix[n-1][n-1];
while(l < r){
int mid = l + (r-l)/2;
int temp = lowerThanMidCount(matrix, mid);
if(temp < k){
l = mid+1;
}else{
r = mid;
}
}
return l;
}
private int lowerThanMidCount(int [][] matrix, int mid){
int n = matrix.length;
int i = 0;
int j = n-1;
int count = 0;
while(i<n && j>=0){
if(matrix[i][j] <= mid){
i++;
count += j+1;
}else{
j--;
}
}
return count;
}
}
来源:CSDN
作者:宰了那只汤姆猫
链接:https://blog.csdn.net/qq_43491066/article/details/104075395