LeetCode 386. 字典序排数(数学/DFS)


题目描述

在这里插入图片描述

解法一:DFS

[ 1 , n ] [1, n] [1,n] 的数按照字典序添加到答案,本质上是对一颗节点数量为 n n n,形态类似字典树的多阶树进行遍历

递归树如下:

在这里插入图片描述

递归实现:

递归调用栈,会使用栈的空间,对于栈空间的使用取决于递归调用深度

class Solution {
    public List<Integer> lexicalOrder(int n) {
        List<Integer> res = new ArrayList<>();
        dfs(res, n, 0);
        return res;
    }

    private void dfs(List<Integer> list, int n, int val) {
        for (int i = 0; i < 10; i++) {
            if (i == 0 && val == 0) {
                continue ;
            }
            if (val * 10 + i > n) {
                return ;
            }
            list.add(val * 10 + i);
            dfs(list, n, val * 10 + i);
        }
    }
}
  • 时间复杂度:本质上在搜索一棵节点数量为 nn 的多阶树(形态类似于字典树),复杂度为 O ( n ) O(n) O(n)
  • 空间复杂度:忽略递归带来的额外空间开销,复杂度为 O ( 1 ) O(1) O(1)

迭代实现:

递归具有额外的空间开销,为了实现严格的 O ( 1 ) O(1) O(1) 空间,需要使用「迭代」来实现 DFS

共有 n n n 个数需要被处理,假设当前处理到的数为 n u m b e r number number,根据字典序规则,它的下一个字典序整数对应下面的规则:

  • 尝试在 n u m b e r number number 后面附加一个零,即 number × 10 \textit{number} \times 10 number×10,如果 number × 10 ≤ n \textit{number} \times 10 \le n number×10n,那么说明 number × 10 \textit{number} \times 10 number×10 是下一个字典序整数;

  • 如果 number   m o d   10 = 9 \textit{number} \bmod 10 = 9 numbermod10=9 number + 1 > n \textit{number} + 1 \gt n number+1>n,那么说明末尾的数位已经搜索完成,退回上一位,即 number = ⌊ number 10 ⌋ \textit{number} = \Big \lfloor \dfrac{\textit{number}}{10} \Big \rfloor number=10number,然后继续判断直到 number   m o d   10 ≠ 9 \textit{number} \bmod 10 \ne 9 numbermod10=9 number + 1 ≤ n \textit{number} + 1 \le n number+1n 为止,那么 number + 1 \textit{number} + 1 number+1 是下一个字典序整数。

public List<Integer> lexicalOrder(int n) {
    List<Integer> ret = new ArrayList<Integer>();
    int number = 1;
    for (int i = 0; i < n; i++) {
        ret.add(number);
        if (number * 10 <= n) {
            number *= 10;
        } else {
            while (number % 10 == 9 || number + 1 > n) {
                number /= 10;
            }
            number++;
        }
    }
    return ret;
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

Reference

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xylitolz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值