这道题虽然标的是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,此时大于kmatrix里有一个lo,此时等于k- 不存在其他可能
