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

1.题目描述

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

示例:

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

返回 13。
说明:
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n^2 。

2.解题思路

1.找出二维矩阵中最小的数left,最大的数right,那么第k小的数必定在left~right之间

2.mid=(left+right) // 2;在二维矩阵中寻找小于等于mid的元素个数count

3.若这个count小于k,表明第k小的数在右半部分且不包含mid,即left=mid+1, right=right,又保证了第k小的数在left~right之间

4.若这个count大于等于k,表明第k小的数在左半部分且可能包含mid,即left=left, right=mid,又保证了第k小的数在left~right之间

5.因为每次循环中都保证了第k小的数在left~right之间,当left==right时,第k小的数即被找出,等于right

时间复杂度:O(nlgX),其中X为最大值和最小值的差值

参考https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/solution/er-fen-chao-ji-jian-dan-by-jacksu1024/

3.代码实现

class Solution(object):
    def findNotBiggerThanMid(self,mid,matrix):
        m=len(matrix)
        n=len(matrix[0])
        i=m-1
        j=0
        res=0
        //从矩阵的左下角开始寻找
        //以列为单位找,找到每一列最后一个<=mid的数即知道每一列有多少个数<=mid
        while i>=0 and j<n:
            if matrix[i][j]<=mid:
                res+=i+1
                j+=1
            else:
                i-=1
        return res

    def kthSmallest(self, matrix, k):
        """
        :type matrix: List[List[int]]
        :type k: int
        :rtype: int
        """
        m=len(matrix)
        n=len(matrix[0])
        left = matrix[0][0]
        right = matrix[m-1][n-1]

        while left < right:
            mid = (left+right)//2
            print mid
            count = self.findNotBiggerThanMid(mid,matrix)
            if count < k:
                left = mid+1
            else:
                right = mid
        return right
            

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值