LeetCode——386.字典序排数

通过万岁!!!

  • 题目:给你一个n,然后将1-n之间的数,按照字典序进行排序。要求时间复杂度o(n),空间复杂度o(1)。
  • 取巧思路:直接存到一个string数组中,然后Arrays.sort。然后转成list。好像排序是存在问题的,因为时间复杂度会超时,但是我居然过了,莫名其妙。虽然我们是通过万岁,但是也不能这么糊弄人啊。
  • 正规思路:我的想法是一个递归,每次往list中添加一个元素num,如果num<n,则可以添加,然后让其*10继续递归,这样将扩大10倍的我们写完了。并且每个数后面应该就是这个数扩大10倍。扩大10倍结束以后,就应该写这个数+1了,我们循环到余数等于9即可,每次也是需要添加完以后递归,例如加完了12以后应该加120。
  • 技巧:就是深度优先吧,其实就是找规律,然后按照规律填充这个数组即可。

java代码——取巧思路

class Solution {
    public List<Integer> lexicalOrder(int n) {
        String[] ans = new String[n];
        for (int i = 1; i <= n; i++) {
            ans[i - 1] = i + "";
        }
        Arrays.sort(ans);
        int[] ints = Arrays.stream(ans).mapToInt(s -> Integer.parseInt(s)).toArray();
        ArrayList<Integer> integers = new ArrayList<>(n);
        for (int t : ints) {
            integers.add(t);
        }
        return integers;
    }
}

java代码——正规思路

class Solution {
    public List<Integer> lexicalOrder(int n) {
        ArrayList<Integer> integers = new ArrayList<>(n);
        getList(integers, n, 1);
        return integers;
    }


    private void getList(ArrayList<Integer> integers, int n, int num) {
        if (num <= n) {
            integers.add(num);
            getList(integers, n, num * 10);
        }
        while (num % 10 != 9 && num < n) {
            integers.add(++num);
            getList(integers, n, num * 10);
        }
    }
}
  • 总结:题目不是很难,并且比较有意思,居然取巧也能过。这里虽然递归嵌套while,但是while的时间复杂度是很小的,并且我们这个其实就是对数组进行变了一个一直add,时间复杂度就是o(n),空间复杂度的话,我们用了一个必须要的list变量,还有递归的栈。这个题没有双百,空间确实有的优点多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值