《剑指offer》刷题系列——(六十八)把数组排成最小的数

题目

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 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(Nlog⁡N) : N 为最终返回值的字符数量;使用快排或内置sort函数的平均时间复杂度为 O(Nlog⁡N),最差为 O(N2)。
空间复杂度 O(N) : 字符串列表占用线性大小的额外空间。

猜你喜欢

转载自blog.csdn.net/weixin_44776894/article/details/107593075