379.Reorder array to construct the minimum number-将数组重新排序以构造最小值(中等题)

本文介绍了一种在不使用额外空间的情况下,通过快速排序算法对整数数组进行重新排序以构造最小值的方法。示例展示了如何从给定数组中得到最小可能数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将数组重新排序以构造最小值

  1. 题目

    给定一个整数数组,请将其重新排序,以构造最小值。

  2. 样例

    给定 [3, 32, 321],通过将数组重新排序,可构造 6 个可能性数字:
    3+32+321=332321
    3+321+32=332132
    32+3+321=323321
    32+321+3=323213
    321+3+32=321332
    321+32+3=321323
    其中,最小值为 321323,所以,将数组重新排序后,该数组变为 [321, 32, 3]。

  3. 挑战

    在原数组上完成,不使用额外空间。

  4. 题解

    本题类似于184.Largest Number-最大数(中等题),是求最小数。但是由于题目要求不能使用额外空间,则需要我们自己实现排序算法(这里使用的是快排算法),元素大小比较可参见184题。

public class Solution {
    /**
     * @param nums n non-negative integer array
     * @return a string
     */
    public String minNumber(int[] nums) {
        StringBuilder sb = new StringBuilder();
        quickSort(nums,0,nums.length-1);
        for (int i=0;i<nums.length;i++)
        {
            if (sb.length() == 0 && nums[i] == 0)
            {
                continue;
            }
            sb.append(String.valueOf(nums[i]));
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }

    private int compare(int o1, int o2)
    {
        return (String.valueOf(o1)+String.valueOf(o2)).compareTo(String.valueOf(o2)+String.valueOf(o1));
    }

    private void quickSort(int[] a, int left, int right)
    {
        if (left < right)
        {
            int temp = a[left];
            int i = left;
            int j = right;
            while (i < j)
            {
                while (j > i && compare(a[j],temp) >=0)
                {
                    j--;
                }
                while (i < j && compare(a[i],temp) <= 0)
                {
                    i++;
                }
                if (i < j)
                {
                    swap(a, i, j);
                }
            }
            swap(a, left, j);
            quickSort(a,left,i-1);
            quickSort(a, i+1, right);
        }
    }

    private void swap(int[] a, int i, int j)
    {
        int temp = a[j];
        a[j] = a[i];
        a[i] = temp;
    }
}

Last Update 2016.11.11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值