668. Kth Smallest Number in Multiplication Table

又是一题可以二分的题目没有看出来。。。我已经对自己的智商不抱希望了。。。
首先:
1.明确的上下界:最小为0,最大为m*n
2.明确的分界线:我们对于每个数,数在乘法表中小于等于它的数的个数,那么它和k的关系应该是这样:小于|等于|大于。其中等于的那一段是因为整除的缘故,所以我们要的是等于中最小的那一个。
难点是:1.想到二分(我尼玛这什么智商)2.想到数小于该数的个数,以及想到该怎么数。
class Solution {
public:
int findKthNumber(int m, int n, int k) {
assert(k >= 1 && k <= m*n);
int lo = 1, hi = m * n;
int mid;
while (lo < hi) {
mid = lo + (hi - lo) / 2;
int cnt = count(m, n, mid);
if (cnt >= k)
hi = mid;
else
lo = mid + 1;
}
return lo;
}
private:
int count(int m, int n, int num) {
int cnt = 0;
for (int i = 1; i <= m; ++i) {
cnt += min(n, num / i);
}
return cnt;
}
};
真的蠢。。
浙公网安备 33010602011771号