【leetcode】179.最大数 (数学题,自定义排序,java实现)

题目179要求从非负整数数组构建最大的整数。通过将整数转换为字符串并自定义排序来解决,考虑数字连接时的顺序影响。在比较过程中,确保高位数字优先,对于相同数字,比较其连接顺序。最终根据排序结果生成最大数字符串。时间复杂度为O(nlgn),空间复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

179. 最大数

难度中等360

给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。

示例 1:

输入: [10,2]
输出: 210

示例 2:

输入: [3,30,34,5,9]
输出: 9534330

说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。

分析

自定义排序:

想法

为了构建最大数字,我们希望越高位的数字越大越好。

算法

首先,我们将每个整数变成字符串。然后进行排序。

如果仅按降序排序,有相同的开头数字的时候会出现问题。比方说,样例 2 按降序排序得到的数字是 9534330395343303 ,然而交换 3 和 30 的位置可以得到正确答案 9534330 。因此,每一对数在排序的比较过程中,我们比较两种连接顺序哪一种更好。我们可以证明这样的做法是正确的:

假设(不是一般性),某一对整数 a和 b ,我们的比较结果是 a 应该在 b 前面,这意味着 a ⌢ b > b ⌢ a a\frown b > b\frown a ab>ba,其中 ⌢ 表示连接。如果排序结果是错的,说明存在一个 c , b在 c前面且 c 在 a 的前面。这产生了矛盾,因为 a ⌢ b > b ⌢ a a\frown b > b\frown a ab>b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值