整数xの重みは、次の規則に従ってxを1に変更するために必要なステップ数として定義します。
xが偶数の場合、x = x / 2
xが奇数の場合、x = 3 * x + 1
たとえば、x = 3の重みは7です。3が1になるには7つのステップが必要なため(3-> 10-> 5-> 16-> 8-> 4-> 2-> 1)。
lo、hi、kの3つの整数を提供します。あなたの仕事は、間隔[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 の重みは
14の重みです
。15 17
の間隔の数値は重みに従ってソートされ、結果は[12,13,14,15]です。k = 2の場合、答えは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
出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/sort-integers-by-the-power-value:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。
アイデア:
[lo、hi]の間のすべての数値は、重みの順にソートされ、k番目に返されます。
重みを計算するプロセスは、メモリの再帰によって処理できます。
時間の複雑さ:O(NlogN)
スペースの複雑さ:O(N)
class Solution(object):
def getKth(self, lo, hi, k):
"""
:type lo: int
:type hi: int
:type k: int
:rtype: int
"""
dic = {}
dic[1] = 0
def func(x):
if x in dic:
return dic[x]
if x % 2:
res = 1 + func(3 * x + 1)
else:
res = 1 + func(x / 2)
dic[x] = res
return res
return sorted(range(lo, hi + 1), key = lambda x: (func(x), x))[k - 1]