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 —— 字典序排数