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

问题描述

给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。

请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。

二分查找

class Solution:
    def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
        n = len(matrix)
        def check(mid):
            i, j = n - 1, 0
            num = 0
            while i >= 0 and j < n:
                if matrix[i][j] <= mid:
                    num += i + 1
                    j += 1
                else:
                    i -= 1
            return num >= k
        
        left, right = matrix[0][0], matrix[n - 1][n - 1]
        while left < right:
            mid = (left + right) // 2 #因为此处向下取整,所以是right = mid, left = mid + 1
            if check(mid):
                right = mid
            else:
                left = mid + 1
        return left
posted @ 2020-07-04 15:27  libbin  阅读(135)  评论(0编辑  收藏  举报