LeetCode 乘法表中第k小的數(二分搜尋)

2021-09-19 07:18:03 字數 1413 閱讀 8843

幾乎每乙個人都用 乘法表。但是你能在乘法表中快速找到第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).

注意:

m 和 n 的範圍在 [1, 30000] 之間。

k 的範圍在 [1, m * n] 之間。

思路分析:這道題可能有人會想著先構造出這個乘法表,然後再去搜尋,但這樣是行不通的,因為m、n的取值可能非常大,非常耗記憶體。首先我們知道在m、n的乘法表中取值範圍為[1, m * n],那麼我們可不可以使用使用二分搜尋呢?

首先觀察乘法表我們會發現,由於構造關係,決定了他每一行都是遞增的。

如果我們需要在第i行中尋找大於num的個數,我們只要min(num / i, n),其中(i是這一行的行號,n是矩陣的列數)num / i代表的是如果num也在第i行,它存在的列數,所以只要取最小值就是第i行不大於num的個數。(比如例題1中,我們需要知道第2行,不大於4的個數,min(4 / 2, 3) == 2個(就是2, 4))

那麼如果我們需要確定這個乘法表中不大於num的個數就非常簡單了,我們只要將每一行不大於num的個數累加即可。(比如例題1中,我們需要知道乘法表中不大於4的個數,第一行3個、第二行2個,第三行1個)

現在我們就可以使用二分搜尋了,初始化left = 1, right = n * m + 1,mid = (left + right) / 2,在m,n的乘法表中尋找不超過mid的個數。

class

solution

else

}return low;

}//在m,n的乘法表中,尋找不大於num的元素個數

Leetcode 668 乘法表中第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...

LeetCode 668 乘法表中第k小的數

幾乎每乙個人都用 乘法表。但是你能在乘法表中快速找到第k小的數字嗎?給定高度m 寬度n的一張m n的乘法表,以及正整數k,你需要返回表中第k小的數字。輸入 m 3,n 3,k 5 輸出 3 解釋 乘法表 1 2 3 2 4 6 3 6 9 第5小的數字是 3 1,2,2,3,3 215,373,37...

乘法表中第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...