题目描述
解题思路
此题求拼接起来的最小数字,本质上是一个排序问题。设数组 nums 中任意两数字的字符串为 x 和 y ,则规定 排序判断规则 为:
- 若拼接字符串 x + y > y + x ,则 x “大于” y ;
 - 反之,若 x + y < y + x ,则 x “小于” y ;
 
x “小于”y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。根据以上规则,套用任何排序方法对 nums 执行排序即可。
算法流程:
- 初始化: 字符串列表 strs ,保存各数字的字符串格式;
 - 列表排序: 应用以上 “排序判断规则” ,对 strs 执行排序;
 - 返回值: 拼接 strs 中的所有字符串,并返回。
 
复杂度分析:
- 时间复杂度 O(NlogN) : NN 为最终返回值的字符数量( strs列表的长度 ≤N );使用快排或内置函数的平均时间复杂度为 O(NlogN) ,最差为 O(N^2)) 。
 - 空间复杂度 O(N) : 字符串列表 strs 占用线性大小的额外空间。
 
本题重要的思路为,自定义排序策略,从而符合题目要求谁在前面,谁在后面。
class Solution {public String minNumber(int[] nums) {String[] array = new String[nums.length];for (int i = 0; i < nums.length; i++) {array[i] = String.valueOf(nums[i]);}quickSort(array, 0, array.length - 1);StringBuilder sb = new StringBuilder();for (int i = 0; i < array.length; i++) {sb.append(array[i]);}return sb.toString();}public void quickSort(String[] array, int l, int r) {if (l >= r) {return;}int i = l, j = r;while (i < j) {while (i < j && (array[j] + array[l]).compareTo(array[l] + array[j]) >= 0) j--;while (i < j && (array[i] + array[l]).compareTo(array[l] + array[i]) <= 0) i++;swap(array, i, j);}swap(array, l, i);quickSort(array, l, i - 1);quickSort(array, i + 1, r);}public void swap(String[] array, int i, int j) {String temp = array[i];array[i] = array[j];array[j] = temp;}}
