剑指 Offer 45. 把数组排成最小的数
解题思路:自定义排序
本题主要求两数拼接起来最小的数字,设nums中任意两数字的字符串为x,y;
- 若拼接后的字符串x+y > y+x,则定义为x“大于”y;
- 反之,若x+y < y+x,则定义为x“小于”y。
根据以上规则对nums数组进行排序,使用快排。
算法流程:
- 初始化:首先将nums数组中的所有数字初始化到字符串列表vector strs中。
- 进行排序:使用快排(本文使用的是挖坑填补法),对strs中的字符串按照以上规则进行排序。
- 将排序后的字符串列表strs中的字符拼接成res返回。
class Solution {
public:
string minNumber(vector<int>& nums) {
vector<string> strs;
for(int i=0;i<nums.size();i++)
strs.push_back(to_string(nums[i]));
quicksort(strs,0,strs.size()-1);
string res;
for(string s : strs)
res.append(s);
return res;
}
public:
int sort(vector<string>& strs,int i,int j)
{
string temp =strs[i];
while(i < j)
{
while(i < j)
{
if(strs[j]+temp <= temp+strs[j])
{
strs[i] = strs[j];
i++;
break;
}
j--;
}
while(i < j)
{
if(strs[i]+temp >= temp+strs[i])
{
strs[j] = strs[i];
j--;
break;
}
i++;
}
}
strs[i] = temp;
return i;
}
void quicksort(vector<string>& strs,int i,int j)
{
if(i >= j)
return;
int nStadard = sort(strs,i,j);
quicksort(strs,i,nStadard-1);
quicksort(strs,nStadard+1,j);
}
};