Kth Smallest Number in Multiplication Table

hard binary search math

Problem

Return the k-th smallest entry of the m × n multiplication table.

Inputm=3 n=3 k=5
Output3
Sorted table: 1,2,2,3,3,4,6,6,9. 5-th is 3.

def find_kth_number(m, n, k):
    def count(v): return sum(min(v // i, n) for i in range(1, m + 1))
    lo, hi = 1, m * n
    while lo < hi:
        mid = (lo + hi) // 2
        if count(mid) < k: lo = mid + 1
        else: hi = mid
    return lo
function findKthNumber(m, n, k) {
  const count = v => { let s = 0; for (let i = 1; i <= m; i++) s += Math.min(Math.floor(v / i), n); return s; };
  let lo = 1, hi = m * n;
  while (lo < hi) {
    const mid = (lo + hi) >> 1;
    if (count(mid) < k) lo = mid + 1; else hi = mid;
  }
  return lo;
}
int findKthNumber(int m, int n, int k) {
    int lo = 1, hi = m * n;
    while (lo < hi) {
        int mid = (lo + hi) / 2, c = 0;
        for (int i = 1; i <= m; i++) c += Math.min(mid / i, n);
        if (c < k) lo = mid + 1; else hi = mid;
    }
    return lo;
}
int findKthNumber(int m, int n, int k) {
    int lo = 1, hi = m * n;
    while (lo < hi) {
        int mid = (lo + hi) / 2, c = 0;
        for (int i = 1; i <= m; i++) c += min(mid / i, n);
        if (c < k) lo = mid + 1; else hi = mid;
    }
    return lo;
}
Time: O(m log(m·n)) Space: O(1)