这道题虽然标的是Medium,但是我觉得绝对是Hard难度,代码虽然不长,但是代码后面的逻辑思考还是难度不少的,第一次碰到同类型的很难做出来
难点1: Binary Search可以不基于Index,而基于Number Range
- 给定一个数(中点),看看比它小的数是不是k个
- 如果小于k,则我们想要找的数必然比这个数大
- 如果大于等于k,则我们找的数则必然小于等于这个数
代码如下:
class Solution {
public int kthSmallest(int[][] matrix, int k) {
int n = matrix.length;
int lo = matrix[0][0];
int hi = matrix[n-1][n-1];
while (lo < hi) {
int mi = lo + (hi - lo) / 2;
int j = n - 1;
int count = 0;
for (int i = 0; i < matrix.length; ++i) {
while (j >= 0 && matrix[i][j] > mi) {
--j;
}
count += (j + 1);
}
if (count < k) {
lo = mi + 1;
}
else {
hi = mi;
}
}
return lo;
}
}
- 空间复杂度:
- 时间复杂度:
- 这个是range based的Binary Search
- 最大值是
max
,最小值是min
难点2:lo
必然是matrix
里面的数,且就是我们要找的答案
- 存在数
lo-1
: 小于等于这个数的必然比k
小 lo
:小于等于这个数的大于等于k,两种可能matrix
里有多个lo
,此时大于k
matrix
里有一个lo
,此时等于k
- 不存在其他可能