题目如下:
给定一个整数 n, 返回从 1 到 n 的字典顺序。
例如,
给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。
请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。
首先观察数字的排列规则, 会发现这是一个N叉树的前序遍历.
子节点和父节点的关系: children = parent*10+i (i =1,2,3…)
需要判断: 节点所属数字不能大于n
第一层子节点不包含0, 可以考虑单独处理.
可以考虑使用dfs遍历N叉树, 代码如下:
List<Integer> result = new ArrayList<>();
public List<Integer> lexicalOrder(int n) {
// 分别处理大于10 和 小于10 时第一层子节点
int max = Math.min(n+1, 10);
// 将第一层子节点放进去
for(int i = 1; i<max; i++){
dfs(n, i);
}
return result;
}
public void dfs(int n, int num){
if(num > n){
return;
}
result.add(num);
for(int i = 0; i<10; i++){
dfs(n, num*10+i);
}
}