这道题要求从一个整数数组中通过全排列得到一个拼接后的最小数。题解中采用了自定义排序策略来解决这个问题。首先,将整数数组转换为字符串数组,以便于处理数字的拼接。接着,定义了一个排序规则 sort_rule,该规则比较两个字符串 x 和 y 拼接后的结果 x+y 和 y+x,来决定 x 和 y 在结果列表中的顺序。这样的比较保证了全局最小的拼接顺序可以被找到。最后,利用 functools.cmp_to_key 将 sort_rule 转换为排序函数,对字符串数组进行排序,并将排序后的数组拼接成一个字符串返回。
时间复杂度: O(n log n * m)
空间复杂度: O(n)
import functools
class Solution:
def minNumber(self, nums: List[int]) -> str:
# 自定义排序规则
def sort_rule(x, y):
a, b = x + y, y + x # 拼接两种可能的字符串
if a > b:
return 1 # a > b 时,x 应该在 y 后面
elif a < b:
return -1 # a < b 时,x 应该在 y 前面
else:
return 0 # a == b 时,顺序无关紧要
# 将数字转换为字符串,以便进行字符串比较
nums_2_strs = [str(num) for num in nums]
# 使用自定义排序规则进行排序
nums_2_strs.sort(key=functools.cmp_to_key(sort_rule))
# 将排序后的字符串数组拼接成一个字符串并返回
return ''.join(nums_2_strs)