【小白也能懂】把数组排成最小的数 只需29ms 还能复习permutation的知识?

把数组排成最小的数

http://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993

题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

这题我们可以发现,他又一次和permutation的题型有点类似,就是给定一个数组,我们找出他所有可能的排列组合,但是因为这题需要我们找出这些排列组合里最小的数字,所以我们需要额外加上一步来找出我们获得的所有排列组合里最小的数字。

所以这题分两步:

  1. permutation找出所有的排列组合 (permutation的详细解法我在另一篇博文里有写:https://blog.nowcoder.net/n/953496776beb4e4d9a9f80112910ae58)
  2. 运用Collections.sort()来帮助我们找出最小值

具体代码如下:

import java.util.ArrayList;
import java.util.*;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        if(numbers == null){
            return null;
        }
        ArrayList<String> result = new ArrayList<>();
        recur(numbers,"",result);
        Collections.sort(result);
        return result.get(0);
    }

    public void recur(int[] numbers, String cur, ArrayList<String>result){
        if(numbers.length == 0){
            for(int i = 0; i < result.size();i++){
                if(result.get(i) == cur){
                    return;
                }
            }
            result.add(cur);
        }

        for(int i = 0; i < numbers.length; i++){
            int[] temp = new int[numbers.length-1];
            int count = 0;
            for(int j = 0; j < numbers.length;j++){
                if(j != i){
                    temp[count] = numbers[j];
                    count++;
                }
            }
            recur(temp,cur+Integer.toString(numbers[i]),result);
        }
    }
}
全部评论
时间复杂度不满足呀,复制过来的代码都通过不了的,楼主测试了吗,思路感觉是没问题的
点赞 回复 分享
发布于 2022-03-02 15:48

相关推荐

vegetable_more_exercise:1-1.5万,没错啊,最少是1人民币,在区间内
点赞 评论 收藏
分享
评论
3
1
分享
牛客网
牛客企业服务