LeetCode 668 乘法表中第k小的數

LeetCode 668 乘法表中第k小的數

一開始拍腦殼想先沿着乘法表對角線搜索, 而後發覺元素大小並非均勻分佈, v=x*y若對xy分別搜索則沒法控制單一變量python

所以直接對v進行二分搜索, 而後如下爲拍腦殼證實搜索結果v一定屬於乘法表中的元素code

cnt(x)表示乘法表搜索區域中<=x的元素個數leetcode

默認題目中的k一定有解io

則若此時知足cnt(x) = k, 則x ∈ [l, r]class

由於cnt(x)範圍爲整數且在均在乘法表中, 所以從l-1l時, cnt(x)的增量均由乘法表中的元素提供, 且l爲其中最大值, 故l爲乘法表中的元素變量

搜索目標爲cnt(v) >= k, 取v的最小值搜索

v = lwhile

所以最終搜索結果v爲乘法表中的元素co

Python3

class Solution:
    def findKthNumber(self, m: int, n: int, k: int) -> int:
        l, r = 1, n*m
        while l < r:
            mid, cnt = l+r >> 1, 0
            for v in (min(mid//i, m) for i in range(1, min(mid, n) + 1)):
                cnt += v
            if cnt < k:
                l = mid + 1
            else:
                r = mid
        return l
相關文章
相關標籤/搜索