2.1 数组排成最小数
1 把数组排成最小数
问题描述
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
- 输入: [10,2]
- 输出: “102”
示例 2:
- 输入: [3,30,34,5,9]
- 输出: “3033459”
问题分析
问题分类
- 排序
算法设计
算法原理:此题求拼接起来的最小数字,本质上是一个排序问题。设数组nums 中任意两数字的字符串为 x 和 y ,则规定 排序判断规则 为:
- 若拼接字符串 x+y>y+x ,则 x “大于” y ;
- 反之,若 x+y<y+x ,则 x “小于” y ;
算法流程
- 初始化: 字符串列表 strsstrs ,保存各数字的字符串格式;
- 列表排序: 应用以上 “排序判断规则” ,对 strsstrs 执行排序;
- 返回值: 拼接 strsstrs 中的所有字符串,并返回。
算法分析
- 时间复杂度O(NlogN) : N 为最终返回值的字符数量( strs列表的长度 N≤N );使用快排或内置函数的平均时间复杂度为 O(NlogN) ,最差为 O(N^2)
- 空间复杂度 O(N)O(N) : 字符串列表 strsstrs 占用线性大小的额外空间。
算法实现
- 以下是自己的方法,循环比较
1 | string minNumber(vector<int>& nums) { |
- 一下是官方的方法。手写快排
1 | class Solution { |
- 一下是官方的方法,内置函数
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Estom的博客!










