7.23 第一次写,无法 AC
7.24 出了点小错误,但大致上还是可以 A 的

题目描述


原题链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/

解题思路


K 神题解:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/solution/

7.24 做题感悟:

  • 核心:改变排序的规则(String 重写过 compareTo 方法,所以直接用就行)image.pngimage.png ```java class Solution { public String minNumber(int[] nums) {

    1. String[] strs = new String[nums.length];
    2. for(int i = 0; i < nums.length; i++)
    3. strs[i] = String.valueOf(nums[i]);
    4. quickSort(strs, 0, strs.length - 1);
    5. StringBuilder res = new StringBuilder();
    6. for(String s : strs)
    7. res.append(s);
    8. return res.toString();

    } public void quickSort(String[] nums, int l, int h) {

      if(l >= h) return; // 切到只剩一个数就不用再切了!已经全部快排完毕了!
    
      int mid = partition(nums, l, h); // 依据切分获得切开左右俩区间的中间索引
      quickSort(nums, l, mid - 1);
      quickSort(nums, mid + 1, h);
    

    }

    // 切分获取切开原数组左右俩区间的中间索引 // 同时确定切分元素在原数组中的位置 public int partition(String[] nums, int l, int h) {

      // 取最左边的元素为切分元素,本身是没毛病的;
      // 但是当数据全为逆序时,其排序的时间复杂读和冒泡排序差不多;
      // 所以我们改进一下,选用中间的元素来当切分元素。
      String cut = nums[l]; 
    
      // 切分的原理还是以最左边的元素为切分元素;
      // 只是把中间的元素换和最左边的元素交换位置;
      // 这样选择的切分元素在逆序数组的情况下时间复杂度就不会太大了!
      //swap(nums, l, (l + h) / 2);
      //String cut = nums[l];
    
      int i = l, j = h;
    
      while(i < j) {
          while(i < j && (nums[j] + cut).compareTo(cut + nums[j]) >= 0) j--;
          while(i < j && (nums[i] + cut).compareTo(cut + nums[i]) <= 0) i++;
          if(i < j) swap(nums, i, j);
      }
      // 将切分元素 nums[l] 换到属于它的位置,并返回其索引 j 
      swap(nums, l, j);
      return j;
    

    }

    public void swap(String[] nums, int i, int j) {

      String tmp = nums[i];
      nums[i] = nums[j];
      nums[j] = tmp;
    

    }

} ```