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