剑指 Offer 45. 把数组排成最小的数

题目:输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。  中等 

方法:快排  时间复杂度O(nlogn)  空间复杂度O(n)  

假设xy表示x在前y在后组成一个数,则 xy > yx ,说明在本题的语境下,x > y,而本题可以转变为从小到大排序,然后再拼接到一起就是最小的数

还要证明 xy > yx  ,yz > zy →  xz > zx

 

 

def minNumber(nums):
        """
        :type nums: List[int]
        :rtype: str
        """
        def quick(l,r):
            if l >= r:
                return 
            
            i,j = l,r
            while i < j:
                while i < j and str(nums[l]) + str(nums[j]) <= str(nums[j]) + str(nums[l]):
                    j -= 1
                while i < j and str(nums[l]) + str(nums[i]) >= str(nums[i]) + str(nums[l]):
                    i += 1
                nums[i],nums[j] = nums[j],nums[i]
            nums[l],nums[i] = nums[i],nums[l]

            quick(l,i - 1)
            quick(i + 1,r)
        nums = [str(num) for num in nums]
        quick(0,len(nums)-1)
        return ''.join(nums)

 

posted @ 2022-08-01 10:51  Liang-ml  阅读(7)  评论(0)    收藏  举报