- 题目描述
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 示例 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占用线性大小的额外空间)