1. 程式人生 > >Leetcode 668.乘法表中第k小的數

Leetcode 668.乘法表中第k小的數

思路 需要 範圍 註意 baidu erl 高度 int for

乘法表中第k小的數

幾乎每一個人都用 乘法表。但是你能在乘法表中快速找到第k小的數字嗎?

給定高度m 、寬度n 的一張 m * n的乘法表,以及正整數k,你需要返回表中第k 小的數字。

例 1:

輸入: m = 3, n = 3, k = 5

輸出: 3

解釋:

乘法表:

1 2 3

2 4 6

3 6 9

第5小的數字是 3 (1, 2, 2, 3, 3).

例 2:

輸入: m = 2, n = 3, k = 6

輸出: 6

解釋:

乘法表:

1 2 3

2 4 6

第6小的數字是 6 (1, 2, 2, 3, 4, 6).

註意:

  1. m 和 n 的範圍在 [1, 30000] 之間。
  2. k 的範圍在 [1, m * n] 之間。

思路

二分查找,對第一個元素和最後一個元素進行二叉搜索,然後每個元素判斷每一行有幾個比其小的值並求和,看是否==k即可

 1 class Solution {
 2     public static int findKthNumber(int m, int n, int k) {
 3         int left = 1, right = m * n, mid;
 4         while (left <= right) {
 5             mid = left + (right - left) / 2;
6 int count = 0, j = n; 7 for (int i = 1; i <= m; i++) { 8 //遍歷每一行 9 // 看一行中有幾個元素小於當前值 10 while (j >= 1 && i * j > mid) j--; 11 //求和 12 count += j; 13 } 14 if (count < k) left = mid + 1;
15 else right = mid - 1; 16 } 17 return left; 18 } 19 }

Leetcode 668.乘法表中第k小的數