LeetCode-378. 有序矩阵中第K小的元素 Python3版本

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


给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
请注意,它是排序后的第k小元素,而不是第k个元素。

示例:

matrix = [
   [ 1,  5,  9],
   [10, 11, 13],
   [12, 13, 15]
],
k = 8,

返回 13。

说明: 
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。

解题思路:看到这种有序(或者部分有序)的数组,一般考虑使用二分查找进行优化。开始时,左指针指向矩阵中最小元素,右指针指向矩阵中最大元素(注意:指针代表的是元素值,而不是位置),计算矩阵中小于等于左右指针中间值的元素个数c,然后通过比较c与k的值,进行左指针或者右指针的移动。重复上述过程直到l >= r.

Python3代码如下:

class Solution(object):
    def kthSmallest(self, matrix, k):
        """
        :type matrix: List[List[int]]
        :type k: int
        :rtype: int
        """
        l = matrix[0][0]
        r = matrix[-1][-1]
        while l < r:
            mid = (l+r)//2
            c = sum(bisect.bisect_right(row,mid) for row in matrix) 
            # bisect.bisect_right(row,mid)计算row中元素值<=mid的数量
            if c < k:
                l = mid + 1
            else:
                r = mid
        return l

LeetCode-378. 有序矩阵中第K小的元素 Python3版本_第1张图片

你可能感兴趣的:(LeetCode)