题目(把数组排成最小的数)
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组 {3,32,321},则打印出这三个数字能排成的最小数字为 321323。
算法思路
最简单的思路是对数组进行全排列,然后判断出最小的一个即可,但是这样的时间复杂度为 O(n!),显然不能这么做。
本题其实只要找到数组的正确排序,即可按照数组顺序自然拼接每个数字。但是,要注意的是对于数字的拼接,我们需要考虑到整数的表示范围问题,因此,为了避免出现大数问题,我们需要将数字转为字符串然后进行拼接。那么既然是排序,我们只需确定一个排序规则即可。
对于给定的两个整数 m ,n,谁在前谁在后呢?那么只要 mn 组成的字符串小于 nm 组成的字符串,那么我们就让 m 在前,n 在后,反之也成立。
算法实现
复杂度分析
本题其实使用的是 c++ STL 中的 sort函数,所以时间复杂度为 O(nlogn)。
参考
[1] <<剑指offer2>>
[2] 牛客网