leetcode题刷250天(76)——第688题 乘法表中第k小的数(二分法)

给定高度m 、宽度n 的一张 m * n的乘法表,以及正整数k,你需要返回表中第k 小的数字。

解题思路:
假设我们要找的值为k,也就是说我们要找出所有不大于k的元素数量
第 i 行 最大值是 当前行数乘以列数
如果有值 x 出现 x/i >= col情况,说明当前行所有值都小于等于x,那么当前行小于等于x的数量为col
如果有值 x 出现 x/i < col情况,说明当前行小于等于x的数量为 x//i
我们可以统计当前值出现下 小于k的数据数目
二分移动,最终找到正好符合 的数,那它就是第k小的元素

class Solution(object):
    def findKthNumber(self, m, n, k):
        
        left, right = 0, m*n+1
        
        while left < right:
            mid = left + (right-left)/2
            print(self.GetOrder(mid, m, n, k))
            # 二分法 统计以 谁  为值能正好符合之前数目等于k的这个情况
            if self.GetOrder(mid, m, n, k) >= k:
                right = mid
            else:
                left = mid + 1
        return left

    def GetOrder(self, mid, row, col, k):
        # 统计当前行列情况下
        # 到底有多少数据符合要求不大于k
        count = 0
        for i in range(1, row+1):
            if mid//i >= col:
                count += col
            else:
                count += mid//i

        return count
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值