难度:中等
题目
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"
示例 2:
输入: [3,30,34,5,9]
输出: "3033459"
提示:
0 < nums.length <= 100
说明:
输出结果可能非常大,所以你需要返回一个字符串而不是整数
拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
解答
思路
快排排序。比较大小的方法需要专门设计。
比较大小的方法:简单讲就是比较 num1_num2 和 num2_num1的大小。为了减少计算时间,将比较分成了两部分。
// minSize=min(num1_size,num2.size)
// 先比较 num1_num2 和 num2_num1在 minSize 范围的大小
// 后面比较 minSize 到 num1_num2_size 范围的大小
知识点
string 中 compare 方法的使用。
快排使用
复杂度 | O |
---|
时间复杂度 | O(mnlog(n)) |
空间复杂度 | O(mn) |
代码
class Solution {
public:
string minNumber(vector<int>& nums) {
quikSort(nums,0,nums.size()-1);
string ret;
for(auto num:nums)
{
string temp=to_string(num);
ret+=temp;
}
return ret;
}
void quikSort(vector<int>& nums,int start,int end)
{
if(end-start<1)
{
return;
}
int pivot=nums[start];
int left=start;
int right =end;
while(left<right)
{
while(left<right&&compare(pivot,nums[right]))
{
right--;
}
nums[left]=nums[right];
while(left<right&&compare(nums[left],pivot))
{
left++;
}
nums[right]=nums[left];
}
nums[left]=pivot;
quikSort(nums,start,left-1);
quikSort(nums,left+1,end);
}
bool compare(int num1,int num2)
{
string numStr1=to_string(num1);
string numStr2=to_string(num2);
int minSize=min(numStr1.size(),numStr2.size());
int comparedResult = numStr1.compare(0,minSize,numStr2,0,minSize);
if(comparedResult==0)
{
string A_B=numStr1+numStr2;
string B_A=numStr2+numStr1;
if(A_B.compare(minSize,A_B.size(),B_A,minSize,A_B.size())<=0)
{
return true;
}
return false;
}
else if(comparedResult<0)
{
return true;
}
else
{
return false;
}
}
};