Skip to main content

179.最大数

标签: string, sort

难度: Medium

通过率: 40.47%

原题链接: https://leetcode.com/problems/largest-number/description/

题目描述

给定一个非负整数的数组 nums,将其重新排列后使得组成的数最大,并返回该结果。结果可能非常大,所以需要返回字符串而不是整数。

解题思路

要形成最大的数字,我们需要一个有效的排序策略来排列这些数字的字符串形式。考虑到两个数字 ab,如果将他们拼接起来形成的数字 ab 大于 ba(即字符串拼接),我们希望 a 排在 b 之前。abba 比较的是两个字符串拼接后的字典序。按此策略对数组中的所有数进行排序。最后将这些数字拼接成一个字符串即可。特殊情况是所有数字都是 0 时,结果应该是 "0" 不是 "000..."

代码实现

from functools import cmp_to_key`    

class LargerNumberKey(str):`
def __lt__(x, y):`
# 定义比较规则:x+y > y+x 则认为 x "大" 于 y`
return x+y > y+x

class Solution:`
def largestNumber(self, nums):`
# 将每个整数转换为字符串`
nums = list(map(str, nums))`
# 按照自定义的字符串比较规则排序`
nums.sort(key=LargerNumberKey)`
# 特殊情况:开头为 0 的多个数字,就说明全为 0 `
if nums[0] == '0':`
return '0'`
# 拼接排序后的字符串`
return ''.join(nums)

复杂度分析

时间复杂度:假设 nn 是数组的长度,mm 是数组中数字的最大位数。排序的时间复杂度为 O(nlogn)O(n \log n)。但每次比较两个字符串的时间是 O(m)O(m),所以整体时间复杂度是 O(nmlogn)O(n \cdot m \log n)

空间复杂度:主要是排序需要的额外空间,所以是 O(n)O(n)