LeetCode 386 字典序排数[dfs 字典树] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 386 字典序排数[dfs 字典树] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

解题思路:
解决这道题的关键就是用字典树的思想,把线性数组想象成字典树组成的集合,横排有9棵树,从1到9,每个树有10棵子树,所以首先从9棵树dfs,再从子树一路往下,本质上是字典树的先序遍历,代码如下:

class Solution 
private:
    vector<int> ans;
public:
    vector<int> lexicalOrder(int n) 
        int cur = 1;
        for(int i = 0; i < 9; i ++) 
            dfs(n, cur + i);
        
        return ans;
    

    void dfs(int n, int cur) 
        if(cur > n) return;
        ans.push_back(cur);
        for(int i = 0; i <= 9; i ++) 
            dfs(n, cur * 10 + i);
        
    
;

但是dfs的空间复杂的是不满足O(1)的,所以要修改成迭代遍历的方式,思路同样是按照树的前序遍历,到达临界条件即到达n或者到了当前子树的末尾,回到子树的根继续向右遍历,代码如下:

class Solution 
public:
    vector<int> lexicalOrder(int n) 
       vector<int> res(n);
        int cur = 1;
        for(int i = 0; i < n; i ++) 
            res[i] = cur;
            if(cur * 10 <= n) 
                cur *= 10;
             else 
                // 如果到了n或者到了当前子树的末尾
                while(cur >= n || cur % 10 == 9) 
                    cur /= 10;
                
                cur ++;
            
        
        return res;
    
;

以上是关于LeetCode 386 字典序排数[dfs 字典树] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

(Java) LeetCode 386. Lexicographical Numbers —— 字典序排数

LeetCode 386. 字典序排数 / 821. 字符的最短距离 / 388. 文件的最长绝对路径

386. 字典序排数

386. 字典序排数(中等)-迭代-全排列

使用DFS来解决“字典序排数”问题

使用DFS来解决“字典序排数”问题