1. 程式人生 > 其它 >386. 字典序排數

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>