前往
大廳
主題

LeetCode - 1492. The kth Factor of n 解題心得

Not In My Back Yard | 2024-04-19 12:00:28 | 巴幣 0 | 人氣 46

題目連結:


題目意譯:
你被給定兩正整數 n 和 k。一個整數 i 如果滿足 n % i == 0,其定義為整數 n 的一個因數。

考慮一個列表其由按升序排列後的所有 n 之因數,回傳在這個列表中第 k 個因數。如果 n 擁有少於 k 個因數,則回傳 -1。

限制:
1 ≦ k ≦ n ≦ 1000

進階:
你可以在小於 O(n) 的時間複雜度解出本題嗎?



範例測資:
範例 1:
輸入: n = 12, k = 3
輸出: 3
解釋: 因數列表為 [1, 2, 3, 4, 6, 12],第 3 個因數為 3。

範例 2:
輸入: n = 7, k = 2
輸出: 7
解釋: 因數列表為 [1, 7],第 2 個因數為 7。

範例 3:
輸入: n = 4, k = 4
輸出: -1
解釋: 因數列表為 [1, 2, 4],而列表只有 3 個因數。因此我們應回傳 -1。


解題思維:
參見這題的第一個作法,並只紀錄可以整除 n 的 i 值(與其對應的 n ÷ i 之值則不用)。

結束之後便找到了所有可以整除 n 的 i 值並存在一個列表中(假設有 C 個這樣子的 i 值並且可以看到這個列表會由小排到大)。而這些 i 值滿足 ≦ sqrt(n),其中 sqrt() 代表取平方根。

如果此時 k ≦ C,則直接回傳第 k 個 i 值即是所求。

反之如果 k > C,則此時會有兩種情況:
    一:n 是完全平方數,即 sqrt(n) 是一個整數。則此時可以看到 n 會有 2C - 1 個因數,因為此時最後一個找到的 i 值會是 sqrt(n),而其對應的「另一個因數」是 n / sqrt(n) = sqrt(n) 本身。因此所求為列表中的第 k - C + 1 大之因數(假設其值為 X)所配對之因數,即 n ÷ x。

    二:n 不是完全平方數,則 n 會有 2C 個因數。而所求為為列表中的第 k - C 大之因數(假設其值為 X)所配對之因數,即 n ÷ x。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作