Leetcode 1387:將整數按權重排序(超詳細的解法!!!)

我們將整數 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)。

給你三個整數 lohik 。你的任務是將區間 [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]

這個問題由於lohi[1, 1000]內,所以我們完全可以將所有數都算出來,然後查表即可。

我將該問題的其他語言版本添加到了我的GitHub Leetcode

如有問題,希望大家指出!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章