题目描述
思路
二分查找
因为m和n可能很大,如果直接计算出所有乘法结果会超时。但是乘法表中的某个数x,比它小的数有多少是很好统计的,每行i都是x/i个。
对于乘法表的值域做比它小的个数的二分,找到k对应的位置。
Python实现
class Solution:
def findKthNumber(self, m: int, n: int, k: int) -> int:
return bisect_left(range(m * n + 1), k, key=lambda x:sum(min(n, x // i) for i in range(1, m + 1))) if n >= m else self.findKthNumber(n, m, k)
Java实现
class Solution {
public int findKthNumber(int m, int n, int k) {
int left = 1, right = m * n;
while (left < right) {
int x = left + (right - left) / 2;
int count = x / n * n;
for (int i = x/ n + 1; i <= m; ++i) {
count += x / i;
}
if (count >= k) {
right = x;
} else {
left = x + 1;
}
}
return left;
}
}