作者:jyd
链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/solution/mian-shi-ti-45-ba-shu-zu-pai-cheng-zui-xiao-de-s-4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
多写写快排算法,一要注意有递归就得有返回条件
二要注意 while循环内部 再有两个while循环,
且与枢纽比较时是>=
和<=
,不要落下等于号
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(auto s:strs){
res.append(s);
}
return res;
}
void quickSort(vector<string>& strs, int l, int r){
// 有递归一定要先写返回条件
if(l>=r) return ;
int i = l, j = r;
while(i<j){
// strs[l] 就是 枢纽
// i在左,j在右 if x+y<=y+x 则 x<=y
// 先动j再动i
while(i<j && (strs[j] + strs[l] >= strs[l] + strs[j])) j--;
while(i<j && (strs[i] + strs[l] <= strs[l] + strs[i])) i++;
swap(strs[i], strs[j]);
}
// 此时i=j, i,j都处在 `枢纽位置`,左边都比枢纽 "小" ,右边都比枢纽 "大""
swap(strs[l], strs[i]);
// 以上代码可以return i, 另起一个叫partition的函数。有人写快排喜欢这样子分开
quickSort(strs, l, i-1);
quickSort(strs, i+1, r);
}
};