386. 字典序排数

386. 字典序排数

难度中等341 收藏 分享 切换为英文 接收动态 反馈

给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。

你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。

示例 1:

输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]

示例 2:

输入:n = 2
输出:[1,2]

方法一:递归

利用二叉树的思想。可以将其想成一个10叉树

 /**
     * 利用二叉树的原理
     * @param n
     * @return
     */
    public List<Integer> lexicalOrder(int n) {
        List<Integer> ans = new ArrayList<>();
        for (int i = 1; i <= Math.min(9, n); i++) {
            dfs(ans, i, n);
        }
        return ans;
    }

    void dfs(List<Integer> ans, int tmp, int n) {
         if (tmp > n) {
            return;
        }
        ans.add(tmp);
        for (int j = 0; j <= 9; j++) {
            int num = tmp * 10 + j;
            // 加上这个,快很多
            if (num > n) {
                break;
            }
            dfs(ans, num, n);
        }
    }

方法2:深度优先算法

官方答案

public  List<Integer> lexicalOrder(int n) {
        List<Integer> ans = new ArrayList<>();
        int num = 1;
        for (int i = 0; i < n; i++) {
            ans.add(num);
            if (num * 10 <= n) {
                num *= 10;
            } else {
                while (num % 10 == 9 || num + 1 > n) {
                    num /= 10;
                }
                num++;
            }
        }
        return ans;
    }

提示:

  • 1 <= n <= 5 * 10<sup>4</sup>
posted @ 2022-04-18 19:56  刘翊扬  阅读(39)  评论(0编辑  收藏  举报