1. 程式人生 > 實用技巧 >劍指 Offer 45. 把陣列排成最小的數(快排)

劍指 Offer 45. 把陣列排成最小的數(快排)

  • 題目描述
輸入一個非負整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。



示例 1:

輸入: [10,2]
輸出: "102"
示例2:

輸入: [3,30,34,5,9]
輸出: "3033459"
  • 解法:快速排序

為什麼要使用快速排序?主要是找到了數字組合結果大小的規律,如下:

因此只需要用快排的思想,將數組裡面的數字進行如上調整即可:

class Solution:
    def minNumber(self, nums: List[int]) -> str:
        def fast_sort(l , r):
            
if l >= r: return i, j = l, r while i < j: while strs[j] + strs[l] >= strs[l] + strs[j] and i < j: j -= 1 while strs[i] + strs[l] <= strs[l] + strs[i] and i < j: i += 1 strs[i], strs[j] = strs[j], strs[i] strs[i], strs[l]
= strs[l], strs[i] fast_sort(l, i - 1) fast_sort(i + 1, r) strs
= [str(num) for num in nums] fast_sort(0, len(strs) - 1) return ''.join(strs)

時間複雜度:O(N log N)

空間複雜度:O(N)(為字串列表str佔用線性大小的額外空間)