中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode如何把數組排成最小的數

發布時間:2021-12-15 13:47:31 來源:億速云 閱讀:164 作者:小新 欄目:大數據

這篇文章主要介紹LeetCode如何把數組排成最小的數,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!


題目描述

輸入一個非負整數數組,把數組里所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。

  • 0 < nums.length <= 100
  • 輸出結果可能非常大,所以你需要返回一個字符串而不是整數
  • 拼接起來的數字可能會有前導 0,最后結果不需要去掉前導 0
         

題目樣例

         

示例

  • 輸入: [10,2]

  • 輸出: "102"

  • 輸入: [3,30,34,5,9]

  • 輸出: "3033459"

         

題目思考

  1. 怎么定義最小?
         

解決方案

         

思路

  • 分析題目, 要使得拼接起來的數字最小, 只有當各個拼接元素按照從小到大拼接起來才可以
  • 而這里的從小到大拼接, 不是指按照數字本身順序或者字典序從小到大拼接
  • 舉個例子, 90 和 902 的拼接結果應該是 90290, 但是 90 不管是數字還是字典序都小于 902
  • 那如何定義哪個數字作為拼接后的第一個數字呢?
  • 假如這個數字和任意其他數字拼接起來, 都小于將兩個數字互換后拼接的結果, 那么顯然這個數字就應該放在首位
  • 到這里就知道了, 我們應該自定義一個排序方法, 對于兩個數字 a 和 b 而言, 比較              str(a)+str(b) 與              str(b)+str(a) 的大小關系, 然后對整個列表排序后組成一個字符串即可
  • 下面的代碼使用兩種方案實現, 一種是快速排序, 一種是語言內置排序, 供大家參考
         

復雜度

  • 時間復雜度              O(NlogN)
    • 排序的時間復雜度
  • 空間復雜度              O(N)
    • 使用了額外的字符串數組
         

代碼

        
方案 1 - 自定義快速排序
class Solution:
    def minNumber(self, nums: List[int]) -> str:
        # 使用map將原數組的數字轉成字符串
        nums = list(map(str, nums))

        def quicksort(l, r):
            # 經典快速排序實現
            if l >= r:
                return
            pivot = nums[l]
            i, j = l, r
            while i < j:
                # 只需要把這里改成自定義的排序方法即可
                while i < j and nums[j] + pivot >= pivot + nums[j]:
                    j -= 1
                nums[i] = nums[j]
                # 只需要把這里改成自定義的排序方法即可
                while i < j and nums[i] + pivot <= pivot + nums[i]:
                    i += 1
                nums[j] = nums[i]
            nums[i] = pivot
            quicksort(l, i - 1)
            quicksort(i + 1, r)

        quicksort(0, len(nums) - 1)
        return ''.join(nums)
                     
方案 2 - 自定義內置排序
class Solution:
    def minNumber(self, nums: List[int]) -> str:
        class compare(str):
            def __lt__(self, x):
                return self + x < x + self

        # 使用python內置sorted的key, 傳入一個重載__lt__的類, 自定義排序
        return ''.join(sorted(map(str, nums), key=compare))

以上是“LeetCode如何把數組排成最小的數”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿勒泰市| 临武县| 巢湖市| 乌恰县| 新巴尔虎左旗| 池州市| 讷河市| 治多县| 遵义县| 巢湖市| 郁南县| 寻甸| 涡阳县| 囊谦县| 故城县| 西峡县| 武功县| 华宁县| 油尖旺区| 射阳县| 双峰县| 荣昌县| 上林县| 沂水县| 穆棱市| 开鲁县| 新和县| 福海县| 文山县| 旌德县| 和静县| 定安县| 佛山市| 图们市| 称多县| 徐闻县| 乐亭县| 阳东县| 绥德县| 滨海县| 常德市|