剑指 offer 45 把数组排成最小的数
代码01
class Solution {
public String minNumber(int[] nums) {
String[] strs = new String[nums.length];
for(int i=0;i<nums.length;i++){
strs[i] = String.valueOf(nums[i]);
}
quickSort(strs,0,strs.length-1);
StringBuilder res = new StringBuilder(strs[0]);
for (int i=1;i<strs.length;i++){
res.append(strs[i]);
}
return res.toString();
}
public void quickSort(String[] strs,int l,int r){
int mid = partion(strs,l,r);
if(mid-1>l){
quickSort(strs,l,mid-1);
}
if(r>mid+1){
quickSort(strs,mid+1,r);
}
}
public int partion(String[] strs,int l,int r){
// int rand =(int)(Math.random()*(r-l+1))+l;
// swap(strs,rand,r);
int small = l-1;
for (int i=l;i<r;i++){
String tmp1 = strs[i]+strs[r];
String tmp2 = strs[r]+strs[i];
if(tmp1.compareTo(tmp2)<0){
small++;
if(small!=i){
swap(strs,small,i);
}
}
}
small++;
swap(strs,small,r);
return small;
}
public void swap(String[] strs,int i,int j){
String tmp = strs[i];
strs[i] = strs[j];
strs[j] = tmp;
}
}
时间复杂度
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),
n
n
n是数组的长度,使用了快速排序时间复杂度是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)。
空间复杂度
O
(
n
)
O(n)
O(n),使用了辅助数组,快排最好的空间复杂度是
O
(
l
o
g
n
)
O(logn)
O(logn),最差的时间复杂度是
O
(
n
)
O(n)
O(n),因此本题的空间复杂度是
O
(
n
)
O(n)
O(n)。