一開始拍腦殼想先沿着乘法表對角線搜索, 而後發覺元素大小並非均勻分佈, v=x*y
若對x
或y
分別搜索則沒法控制單一變量python
所以直接對v
進行二分搜索, 而後如下爲拍腦殼證實搜索結果v
一定屬於乘法表中的元素code
設cnt(x)
表示乘法表搜索區域中<=x
的元素個數leetcode
默認題目中的k
一定有解io
則若此時知足cnt(x) = k
, 則x ∈ [l, r]
class
由於cnt(x)
範圍爲整數且在均在乘法表中, 所以從l-1
至l
時, cnt(x)
的增量均由乘法表中的元素提供, 且l
爲其中最大值, 故l
爲乘法表中的元素變量
搜索目標爲cnt(v) >= k
, 取v
的最小值搜索
則v = l
while
所以最終搜索結果v
爲乘法表中的元素co
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