Skip to the content.

leetcode [378] 有序矩阵中第K小的元素


Contact me:

Blog -> https://cugtyt.github.io/blog/index
Email -> cugtyt@qq.com
GitHub -> Cugtyt@GitHub


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

示例:

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

返回 13。

说明:

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

来自题解:

二分查找,最小值第一个,最大值最后一个,mid为中间值,统计小于等于mid的数量,如果小,low = mid + 1,否则high = mid

class Solution:
    def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
        def count(target, l):
            i = 0
            j = l-1
            counter = 0
            while j >= 0 and i < l:
                if matrix[i][j] <= target:  #!!! 小于等于,必须包含相等,即便等于目标值的数量
                    counter += j + 1
                    i += 1
                else:
                    j -= 1
            return counter
        
        low = matrix[0][0]
        n = len(matrix)
        high = matrix[n-1][n-1]
        while low < high:
            mid = (high + low) // 2
            c = count(mid, n)    # O(N)
            if c < k:    # 包含相等的数量小于k,才将中间值加1
                low = mid + 1
            else:
                high = mid
        return high