给定高度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