乘法表中第k小的數 二分法

2021-10-05 08:59:32 字數 924 閱讀 7054

幾乎每乙個人都用 乘法表。但是你能在乘法表中快速找到第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=9*10^8,不可取。

二分思想,二分列舉第k小的數mid, mid的值初始一定在[1, m*n]之間。統計乘法表中小於等於mid的元素個數,這裡如果還是簡單遍歷的話,複雜度o(m*n),需要一種快速的方法。

從第一行i=1開始遍歷,這一行滿足小於等於mid的元素有min(mid/1, n)個,類似的,第二行滿足條件的元素有min(mid/2, n),...第i行有min(mid/i, n),遍歷到min(mid, m)行即可,後面的滿足條件的元素均為0,不用考慮。

class solution {

public:

int findkthnumber(int m, int n, int k) {

int low = 1, high = m*n, mid, cnt;

while (low這裡需要格外注意二分迴圈條件和邊界的更新。 

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

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

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

第k大數 二分法

時間限制 10 sec 記憶體限制 128 mb 有兩個序列a,b,它們的長度分別為n和m,那麼將兩個序列中的元素對應相乘後得到的n m個元素從大到小排列後的第k個元素是什麼?輸入的第一行為乙個正整數t t 10 代表一共有t組測試資料。每組測試資料的第一行有三個正整數n,m和k 1 n,m 100...

二分法小總結

主要分為兩種 區間按序列劃分和區間按值劃分 區間按序列劃分 這種比較常見,一般是針對有序陣列或者部分有序陣列 如旋轉有序陣列 m是序列的中點,不斷的縮小區間。33 81 153 154 69 162 4 74 區間按值劃分 主要是無序陣列會使用,m取可能結果的最小值和最大值的中值,所以就是不停的猜m...