剑指 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)

浙公网安备 33010602011771号