Nearly every one have used the . But could you find out the k-th
smallest number quickly from the multiplication table?
Given the height m
and the length n
of a m * n
Multiplication Table, and a positive integer k
, you need to return the k-th
smallest number in this table.
Example 1:
Input: m = 3, n = 3, k = 5Output: Explanation: The Multiplication Table:1 2 32 4 63 6 9The 5-th smallest number is 3 (1, 2, 2, 3, 3).
Example 2:
Input: m = 2, n = 3, k = 6Output: Explanation: The Multiplication Table:1 2 32 4 6The 6-th smallest number is 6 (1, 2, 2, 3, 4, 6).
Note:
- The
m
andn
will be in the range [1, 30000]. - The
k
will be in the range [1, m * n]
Approach: #1 Bianry Serach
class Solution {public: int findKthNumber(int m, int n, int k) { int l = 1, r = m * n; while (l < r) { int mid = l + (r - l) / 2; if (!bignums(mid, m, n, k)) l = mid + 1; else r = mid; } return l; }private: bool bignums(int x, int m, int n, int k) { int count = 0; for (int i = 1; i <= m; ++i) { count += min(x/i, n); } return count >= k; }};
Runtime: 24 ms, faster than 12.44% of C++ online submissions for Kth Smallest Number in Multiplication Table.
Analysis:
for (int i = 1; i <= m; ++i) { count += min(x/i, n); }
we use this code to find the numbers of elements less than k , in the row of i the elements are i, 2*i, 3*i, 4*i, 5*i ........ the largest number is k * i <= x, so the numbers of elements which is less than or equal to x is k = x / i;