剑指 Offer 45. 把数组排成最小的数 - 力扣(LeetCode)

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

思路:


  1. 一个简易的判断是 str1+str2 < str2+str1 则str1“小于”str2 反之亦反

复杂度:

O(nlogn)快排复杂度

题解:

  1. 内置函数
class Solution {
public:
    string minNumber(vector<int>& nums) {
        vector<string> strs;
        string res;
        for(int i = 0; i < nums.size(); i++)
            strs.push_back(to_string(nums[i]));
        sort(strs.begin(), strs.end(), [](string& x, string& y){ return x + y < y + x; });
        //注意内置函数的使用语法
        for(int i = 0; i < strs.size(); i++)
            res.append(strs[i]);
        return res;
    }
};
  1. 改写sort函数逻辑

    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;
        }
    private:
        void quickSort(vector<string>& strs, int l, int r) {
            if(l >= r) return;
            int i = l, j = r;
            while(i < j) {//没看懂。。之后复习sort写法的时候再来看
                while(strs[j] + strs[l] >= strs[l] + strs[j] && i < j) j--;
                while(strs[i] + strs[l] <= strs[l] + strs[i] && i < j) i++;
                swap(strs[i], strs[j]);
            }
            swap(strs[i], strs[l]);
            quickSort(strs, l, i - 1);
            quickSort(strs, i + 1, r);
        }
    };