乘法表中第k小的数
难度:困难
通过二分查找求解。
对每个数 mid 都判断乘法表中有res个数小于它,如果res>=k,则证明mid太大,应令right=mid;反之则让left=mid+1。
求解过程中需要注意,会出现多个符合的答案,但只有最小的那个值会出现在乘法表中,这也是res>=k的原因(而不是res>k)。
代码如下:
public class KthSmallestNumberInMultiplicationTable {
public int findKthNumber(int m, int n, int k) {
int left = 1;
int right = m * n;
// [left, right]
while (left < right) {
int mid = left + (right - left) / 2;
if (count(m, n, mid) >= k) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
// 统计乘法表中有多少个数小于等于 k
int count(int m, int n, int k) {
int res = 0;
// 统计每行小于等于 k 的数目
for (int i = 1; i <= m; ++i) {
res += Math.min(k / i, n);
}
return res;
}
}
执行结果:成功