668. Kth Smallest Number in Multiplication Table

Problem:

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]
  3. </ol> </p>

    Solutions:

    class Solution {
    public:
        int findKthNumber(int m, int n, int k) {
            int left = 1; 
            int right = m * n;
    
            while (left < right) {
                int mid = left + (right - left) / 2;
    
                int count = countSmallerNum(m, n, mid);
                if (count >= k) {
                    right =  mid;
                } else {
                    left = mid + 1;
                }
            }
    
            return left;
        }
    
    private:
        int countSmallerNum(int m, int n, int num) {
            int row = m - 1;
            int col = 0;
    
            int count = 0;
            while (row >= 0 && col < n) {
                int product = (row + 1) * (col + 1);
                if (product <= num) {
                    count += row + 1;
                    ++col;
                } else if (product > num) {
                    --row;
                } 
            }
    
            return count;
        }
    
    };
    

    results matching ""

      No results matching ""