劍指 Offer 45. 把陣列排成最小的數(快排)
阿新 • • 發佈:2020-09-22
- 題目描述
輸入一個非負整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。 示例 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佔用線性大小的額外空間)