🌕🌕 386. 字典序排数

吞佛童子2022年10月10日
  • algorithm
  • 递归
  • 迭代
  • 找规律
大约 1 分钟

🌕🌕 386. 字典序排数

难度: 🌕🌕

问题描述

img_56.png


解法 1 - 递归

class Solution {
    List<Integer> res = new ArrayList<>();
    public List<Integer> lexicalOrder(int n) {
        // 思路:
        // 可以看作多叉树,每一层有 0-9 种选择
        // 先序遍历结果即为字典序
        // 最多有 5 层,因此可以看作 O(1) 空间复杂度
        for(int i = 1; i <= 9; i ++) {
            mySol(i, n);
        }
        return res;
    }

    private void mySol(int left, int right) {
        // 递归终止条件
        if(left > right) {
            return;
        }
        // left <= right
        res.add(left);
        // 继续往下一层寻找
        left *= 10;
        for(int i = 0; i <= 9; i ++) {
            mySol(left + i, right);
        }
    }
}

输出 1

img_55.png


解法 2 - 迭代

class Solution {
    public List<Integer> lexicalOrder(int n) {
        // 思路:
        // 迭代
        // 假设当前值为 cur,下一次尝试添加 cur * 10,如果 cur*10 不满足要求,尝试添加 cur + 1,
        // 直到 cur 最低为为 9,返回上一层,即 cur /= 10
        // 每次循环变更一次 cur 的状态,因此一共需要循环 n 次
        ArrayList<Integer> res = new ArrayList<>();
        int cur = 1;
        for(int i = 1; i <= n; i ++) {
            res.add(cur);
            // 获取 cur 的下一个有效状态
            if(cur * 10 <= n) {
                cur *= 10; // 尝试在 cur 后面添加 0
            } else {
                // cur 已经是最底层了,无法继续到下一层
                // 尝试在当前层找下一个节点,如果当前层不存在下一个节点,继续往上一层找
                while(cur % 10 == 9 || cur >= n) {
                    cur /= 10; // 直到上面的某个层并不是最后一个节点
                }
                cur ++;
            }
        }
        return res;
    }
}

输出 2

img_57.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou