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