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

    技术2025-06-03  34

    class Solution { public: struct cmp{ bool operator()(string a, string b){return a+b < b+a ;} }cmp; string minNumber(vector<int>& nums) { vector<string> vec; for(auto num: nums) vec.push_back(to_string(num)); sort(vec.begin(),vec.end(),cmp); string result = ""; for(auto it=vec.begin();it!=vec.end();it++){ string str = *it; result += str; } return result; } };

    证明见《剑指offer 第二版》P229-P230

    书中有一步 A 1 A 2 ⋯ A y − 1 A y ⋯ A n < A 1 A 2 ⋯ A y A y − 1 ⋯ A n A_{1}A_{2}\cdots A_{y-1}A_{y} \cdots A_{n} < A_{1}A_{2}\cdots A_{y}A_{y-1} \cdots A_{n} A1A2Ay1AyAn<A1A2AyAy1An 让读者自己证明,下给出证明

    因为 A y − 1 A y < A y A y − 1 A_{y-1}A_{y} < A_{y}A_{y-1} Ay1Ay<AyAy1 且两个字符串中 A 1 A 2 ⋯ A y − 2 X X A y + 1 ⋯ A n A_{1}A_{2}\cdots A_{y-2} XX A_{y+1}\cdots A_{n} A1A2Ay2XXAy+1An部分相同,且XX等长。所以 A 1 A 2 ⋯ A y − 1 A y ⋯ A n < A 1 A 2 ⋯ A y A y − 1 ⋯ A n A_{1}A_{2}\cdots A_{y-1}A_{y} \cdots A_{n} < A_{1}A_{2}\cdots A_{y}A_{y-1} \cdots A_{n} A1A2Ay1AyAn<A1A2AyAy1An

    Processed: 0.009, SQL: 9