解题思路:
解决这道题的关键就是用字典树的思想,把线性数组想象成字典树组成的集合,横排有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;
}
};