题目描述

image.png

解题思路

此题求拼接起来的最小数字,本质上是一个排序问题。设数组 nums 中任意两数字的字符串为 x 和 y ,则规定 排序判断规则 为:

  • 若拼接字符串 x + y > y + x ,则 x “大于” y ;
  • 反之,若 x + y < y + x ,则 x “小于” y ;

x “小于”y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。根据以上规则,套用任何排序方法对 nums 执行排序即可。
image.png
算法流程:

  • 初始化: 字符串列表 strs ,保存各数字的字符串格式;
  • 列表排序: 应用以上 “排序判断规则” ,对 strs 执行排序;
  • 返回值: 拼接 strs 中的所有字符串,并返回。

复杂度分析:

  • 时间复杂度 O(NlogN) : NN 为最终返回值的字符数量( strs列表的长度 ≤N );使用快排或内置函数的平均时间复杂度为 O(NlogN) ,最差为 O(N^2)) 。
  • 空间复杂度 O(N) : 字符串列表 strs 占用线性大小的额外空间。

本题重要的思路为,自定义排序策略,从而符合题目要求谁在前面,谁在后面。

  1. class Solution {
  2. public String minNumber(int[] nums) {
  3. String[] array = new String[nums.length];
  4. for (int i = 0; i < nums.length; i++) {
  5. array[i] = String.valueOf(nums[i]);
  6. }
  7. quickSort(array, 0, array.length - 1);
  8. StringBuilder sb = new StringBuilder();
  9. for (int i = 0; i < array.length; i++) {
  10. sb.append(array[i]);
  11. }
  12. return sb.toString();
  13. }
  14. public void quickSort(String[] array, int l, int r) {
  15. if (l >= r) {
  16. return;
  17. }
  18. int i = l, j = r;
  19. while (i < j) {
  20. while (i < j && (array[j] + array[l]).compareTo(array[l] + array[j]) >= 0) j--;
  21. while (i < j && (array[i] + array[l]).compareTo(array[l] + array[i]) <= 0) i++;
  22. swap(array, i, j);
  23. }
  24. swap(array, l, i);
  25. quickSort(array, l, i - 1);
  26. quickSort(array, i + 1, r);
  27. }
  28. public void swap(String[] array, int i, int j) {
  29. String temp = array[i];
  30. array[i] = array[j];
  31. array[j] = temp;
  32. }
  33. }