元素组合
把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例1:
输入: [10,2]
输出: "102"
示例2:
输入: [3,30,34,5,9]
输出: "3033459"
方案A 快速排序
思路: 排序判断规则为
- 若拼接字符串 x + y > y + x ,则 x “大于” y ;
- 反之,若 x + y < y + x ,则 x “小于” y ;
x “小于” y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。
根据以上规则,套用快速排序方法对 numsn 执行排序即可。
:::details 点击查看代码
function minNumber(nums) {
const sort=(nums,start,end)=>{
if(start>=end){
return
}
let left=start;
let right=end;
let pivot=nums[Math.floor((left+right)/2)];
while(left<=right){
while(Number(String(nums[left])+String(pivot))<Number((String(pivot)+String(nums[left])))){
left++;
}
while(Number(String(nums[right])+String(pivot))>Number((String(pivot)+String(nums[right])))){
right--;
}
if(left<=right){
[nums[left],nums[right]]=[nums[right],nums[left]];
left++;
right--;
}
}
sort(nums,start,right);
sort(nums,left,end);
}
sort(nums,0,nums.length-1);
return nums.reduce((prev,curr)=>prev+curr,'')
};
:::
性能分析:
-
时间复杂度:O(NlogN)
-
空间复杂度:O(N)