剑指 Offer 45. 把数组排成最小的数

剑指 Offer 45. 把数组排成最小的数

在这里插入图片描述
解题思路:自定义排序
本题主要求两数拼接起来最小的数字,设nums中任意两数字的字符串为x,y;

  • 若拼接后的字符串x+y > y+x,则定义为x“大于”y;
  • 反之,若x+y < y+x,则定义为x“小于”y。

根据以上规则对nums数组进行排序,使用快排。

算法流程:

  1. 初始化:首先将nums数组中的所有数字初始化到字符串列表vector strs中。
  2. 进行排序:使用快排(本文使用的是挖坑填补法),对strs中的字符串按照以上规则进行排序。
  3. 将排序后的字符串列表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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值