题目

image.png
https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/

题目

方法一

合并成一个一维数组之后排序,取出第k个。

方法二

二分查找。

由于矩阵是有排序关系的,任意取一个数num,该数在矩阵最小值和最大值之间,那么该数定可以把矩阵分成左右两半部分。左半部分是小于num的数,进一步可以把小于num的数的数量统计出来。右半部分同理。

可以二分去搜索这个数。

代码

  1. class Solution:
  2. def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
  3. n = len(matrix)
  4. def check(mid):
  5. i, j = n - 1, 0
  6. num = 0
  7. while i >= 0 and j < n:
  8. if matrix[i][j] <= mid:
  9. num += i + 1
  10. j += 1
  11. else:
  12. i -= 1
  13. return num >= k
  14. left, right = matrix[0][0], matrix[-1][-1]
  15. while left < right:
  16. mid = (left + right) // 2
  17. if check(mid):
  18. right = mid
  19. else:
  20. left = mid + 1
  21. print(mid, left, right)
  22. return left