我們將整數 x
的 權重 定義爲按照下述規則將 x
變成 1
所需要的步數:
- 如果
x
是偶數,那麼x = x / 2
- 如果
x
是奇數,那麼x = 3 * x + 1
比方說,x=3 的權重爲 7 。因爲 3 需要 7 步變成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。
給你三個整數 lo
, hi
和 k
。你的任務是將區間 [lo, hi]
之間的整數按照它們的權重 升序排序 ,如果大於等於 2 個整數有 相同 的權重,那麼按照數字自身的數值 升序排序 。
請你返回區間 [lo, hi]
之間的整數按權重排序後的第 k
個數。
注意,題目保證對於任意整數 x
(lo <= x <= hi)
,它變成 1
所需要的步數是一個 32 位有符號整數。
示例 1:
輸入:lo = 12, hi = 15, k = 2
輸出:13
解釋:12 的權重爲 9(12 --> 6 --> 3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)
13 的權重爲 9
14 的權重爲 17
15 的權重爲 17
區間內的數按權重排序以後的結果爲 [12,13,14,15] 。對於 k = 2 ,答案是第二個整數也就是 13 。
注意,12 和 13 有相同的權重,所以我們按照它們本身升序排序。14 和 15 同理。
示例 2:
輸入:lo = 1, hi = 1, k = 1
輸出:1
示例 3:
輸入:lo = 7, hi = 11, k = 4
輸出:7
解釋:區間內整數 [7, 8, 9, 10, 11] 對應的權重爲 [16, 3, 19, 6, 14] 。
按權重排序後得到的結果爲 [8, 10, 11, 7, 9] 。
排序後數組中第 4 個數字爲 7 。
示例 4:
輸入:lo = 10, hi = 20, k = 5
輸出:13
示例 5:
輸入:lo = 1, hi = 1000, k = 777
輸出:570
提示:
1 <= lo <= hi <= 1000
1 <= k <= hi - lo + 1
解題思路
首先不難想到暴力解法,也就是對於每個數字分別計算需要多少步,然後排序取出權重第k
大的數即可。
class Solution:
def getKth(self, lo: int, hi: int, k: int) -> int:
def cal(x):
res = 0
while x != 1:
if x & 1: x = x * 3 + 1
else: x //= 2
res += 1
return res
return sorted(list(range(lo, hi + 1)), key=lambda x: cal(x))[k - 1]
這個問題由於lo
和hi
在[1, 1000]
內,所以我們完全可以將所有數都算出來,然後查表即可。
我將該問題的其他語言版本添加到了我的GitHub Leetcode
如有問題,希望大家指出!!!