算法 - 剑指Offer 把数组排成最小的数

该问题通过将非负整数数组中的数字转换为字符串并进行特定排序来解决。利用字符串比较规则,可以确定数字的相对顺序。通过快速排序算法,以x+y>z+x的逻辑判断每次交换是否有助于得到最小数字。最终,排序后的字符串数组连接起来即为最小拼接数字。
摘要由CSDN通过智能技术生成

题目

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

解题思路

这题看似很简单其实难得的看不懂, 也是在大佬们的解题下才会做的, 首先先说结论, 我们比较两个字符串的时候 x + y > y + x的时候可以得知 x > y, x + y < y + x的时候可以得知 x < y, 然后当更多的数字进来比较后可归纳得出的结论是 x < y, y < z , z< a=> x < y < z,并且最后x+y+z得出的结论就是最小值, 证明过程可看B站大佬的解说BV1uV411i7uh这个视频,解说的很详细, 然后按照上述结论我们可以使用快速排序去对此题进行解答, 代码如下。

Java代码实现

public class MinNumber {
    public String minNumber(int[] nums) {
        String[] tmp = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            tmp[i] = String.valueOf(nums[i]);
        }
        quickSort(tmp, 0 , tmp.length - 1);
        StringBuilder res = new StringBuilder();
        for(String s : tmp)
            res.append(s);
        return res.toString();
    }
    public void quickSort(String[] arrays, int leftIndex, int rightIndex){
        if(leftIndex > rightIndex ){
            return;
        }
        int l = leftIndex;
        int r = rightIndex;
        while(l < r){
            while((arrays[r] + arrays[leftIndex]).compareTo(arrays[leftIndex] + arrays[r]) >= 0 && l < r){
                r --;
            }
            while((arrays[l] + arrays[leftIndex]).compareTo(arrays[leftIndex] + arrays[l]) <= 0 && l < r){
                l ++;
            }
            swap(arrays, l , r);
        }
        swap(arrays, l, leftIndex);
        quickSort(arrays, leftIndex, l - 1);
        quickSort(arrays,l + 1 , rightIndex);
    }
    private void swap(String[] res, int i, int j) {
        String tmp = res[j];
        res[j] = res[i];
        res[i] = tmp;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值