378. 有序矩阵中第K小的元素

Medium

方法一(降维排序)

思路

首先想到的最为粗暴的方式,是将二维数组转化成一维数组,重新进行排序之后得出结果

尝试写一下代码,AC!

代码

python3

class Solution:
    def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
      temp = []
      for i in range(len(matrix)):
        temp += matrix[i]
      return sorted(temp)[k-1]

方法二(二分)

思路

对于一个有序的数列我们可以使用二分的方式搜索目标值。

我们这样就需要解决几个问题,一个是如何找到中间值mid是第几个最小的元素,另一个是边界条件

对于第一个问题我们可以参考240. 搜索二维矩阵 II的解法

对于第二个问题,我们可以通过分析边界,可调试来解决

以上,尝试写一下代码,AC!

代码

python3

class Solution:
    def findNum(self, matrix, m):
      num = 0
      i = len(matrix) - 1
      j = 0
      while i >= 0 and j >= 0 and i < len(matrix) and j < len(matrix):
        if matrix[i][j] > m:
          i -= 1
        else:
          j += 1
          num += i+1
      return num
        
    def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
      start = matrix[0][0]
      end = matrix[-1][-1]

      while start < end:
        mid = start + (end - start) // 2
        n = self.findNum(matrix, mid)
        if n >= k:
          end = mid
        else:
          start = mid + 1
      return start