668. Kth Smallest Number in Multiplication Table

Nearly every one have used the Multiplication Table. 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 = 5
Output: 
Explanation: 
The Multiplication Table:
1	2	3
2	4	6
3	6	9

The 5-th smallest number is 3 (1, 2, 2, 3, 3).

 

Example 2:

Input: m = 2, n = 3, k = 6
Output: 
Explanation: 
The Multiplication Table:
1	2	3
2	4	6

The 6-th smallest number is 6 (1, 2, 2, 3, 4, 6).

 

Note:

  1. The m and n will be in the range [1, 30000].
  2. 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;           

 

posted @ 2018-11-08 17:34  Veritas_des_Liberty  阅读(290)  评论(0编辑  收藏  举报