[LeetCode]378. Kth Smallest Element in a Sorted Matrix

378. Kth Smallest Element in a Sorted Matrix

二分搜索

思路:每次扫描的统计小于中间值的个数,如果个数小于k,则说明不够,还要向右;如果个数大于k,则说明已经够了,那么则向左移动。

class Solution(object):
    def kthSmallest(self, matrix, k):
        """
        :type matrix: List[List[int]]
        :type k: int
        :rtype: int
        """
        low, high = matrix[0][0], matrix[-1][-1]
        while low < high:
            mid = (low + high) // 2
            cnt = 0
            j = len(matrix[0]) - 1
            for i in range(len(matrix)):
                while j >= 0 and matrix[i][j] > mid:
                    j -= 1
                cnt += j + 1
            if cnt < k:
                low = mid + 1
            else:
                high = mid
        return low

或者使用模块biset实现二分查找,如下:

class Solution(object):
    def kthSmallest(self, matrix, k):
        """
        :type matrix: List[List[int]]
        :type k: int
        :rtype: int
        """
        # Time:  O((logn)*(log(max-min)))
        # Space: O(1)
        l = matrix[0][0]
        r = matrix[-1][-1]
        while l < r:
            cnt = 0
            mid = (l+r)/2
            for row in matrix:
                cnt += bisect.bisect_right(row, mid)
            if cnt < k:
                l = mid + 1
            else:
                r = mid
        return l
posted @ 2017-09-06 21:51  banananana  阅读(81)  评论(0编辑  收藏  举报