欢迎访问LeetCode题解合集
题目描述
给定一组非负整数 nums
,重新排列它们每个数字的顺序(每个数字不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:"210"
示例 2:
输入:nums = [3,30,34,5,9]
输出:"9534330"
示例 3:
输入:nums = [1]
输出:"1"
示例 4:
输入:nums = [10]
输出:"10"
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 10^9
题解:
排序。
如果有两个字符串 s1
和 s2
,按照 s1 + s2
与 s2 + s1
拼接的大小关系比较大小即可。
而对多个元素时,按照相邻两个元素 s1 + s2 > s2 + s1
进行排序即可。
下面来证明这个排序方式为什么是对的:
已知: s1
应在 s2
前面, s2
应在 s3
前面
证明: s1
应在 s3
前面。
反证法:
假设 s3
应在 s1
前面,因为 s2
应在 s3
前面,推出 s2
应在 s1
前面,与已知矛盾,假设不成立。
时间复杂度:$O(nlogn)$
额外空间复杂度:$O(1)$
class Solution {
public:
string largestNumber(vector<int>& nums) {
sort( nums.begin(), nums.end(), [](int a, int b){
string s1 = to_string(a);
string s2 = to_string(b);
return s1 + s2 > s2 + s1;
});
if( !nums[0] ) return "0";
string ret = "";
for( int& it : nums )
ret += to_string(it);
return ret;
}
};
/*
时间:12ms,击败:73.20%
内存:10.8MB,击败:81.04%
*/