题目
给定一组非负整数 ,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
解题思路:最大数
对于 中的任意两个值
和
,我们无法直接从常规角度上确定其 大小 / 先后 关系。
但我们可以根据「结果」来决定和
的排序关系:
如果拼接结果
要比
大,那么我们会认为
应该放在
前面。
另外,注意我们需要处理前导零(最多保留一位)。
解题思路:最小数
对于 中的任意两个值
和
,我们无法直接从常规角度上确定其 大小 / 先后 关系。
但我们可以根据「结果」来决定和
的排序关系:
如果拼接结果
要比
小,那么我们会认为
应该放在
前面。
另外,注意我们需要处理前导零(最多保留一位)。
复杂度分析
时间复杂度: ,其中
是数组的长度。
- 由于是对  进行排序,当排序对象不是  中的基本数据类型时,不会使用**快排**(考虑排序稳定性问题)。** **的底层实现会**「元素数量/元素是否大致有序」**决定是使用**插入排序**还是**归并排序**,这里直接假定使用的是**「插入排序」,**故而时间复杂度是  。
空间复杂度:
我的代码
public class Solution {
public String largestNumber(int[] nums) {
String[]strings=new String[nums.length];
for (int i=0;i<nums.length;i++){
strings[i]=nums[i]+"";
}
//o2+o1 > o1+o2 则o2放前面
Arrays.sort(strings, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String a=o1+o2;
String b=o2+o1;
return b.compareTo(a);
}
});
if(strings[0].equals("0"))return "0";
StringBuffer res=new StringBuffer();
for (int i=0;i<nums.length;i++){
res.append(strings[i]);
}
return res.toString();
}
}