题目
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: “102”
示例 2:
输入: [3,30,34,5,9]
输出: “3033459”
思路
定义一个排序规则,数组根据这个规则排序之后能排成一个最小的数字。要确定排序规则,就要比较两个数字,也就是给出两个数字m和n,我们需要确定一个规则判断哪个应该排在前面。
两个数字m和n可以拼接成mn和nm。如果mn<nm,那么我们应该打印mn,也就是m应该排在n前面,此时定义m小于n;反之,如果nm<mn,我们定义n小于m;如果mn=nm,定义m=n。
根据这个排序规则对数组中的数进行排序,最后拼接。
排序方式可以选择快速排序。
代码
class Solution:
def minNumber(self, nums: List[int]) -> str:
arr = [str(num) for num in nums]
self.fast_sort(arr,0,len(arr)-1)
return ''.join(arr)
def fast_sort(self,s,low,high):
if low >= high: return
left,right = low,high
key = s[left]
while left<right:
while key+s[right]<=s[right]+key and left<right: right-=1
s[left] = s[right]
while s[left]+key<=key+s[left] and left<right: left+=1
s[right] = s[left]
s[left]=key
self.fast_sort(s,low,left-1)
self.fast_sort(s,left+1,high)
复杂度
时间复杂度 O(NlogN) : N 为最终返回值的字符数量;使用快排或内置sort函数的平均时间复杂度为 O(NlogN),最差为 O(N2)。
空间复杂度 O(N) : 字符串列表占用线性大小的额外空间。