目标
给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。
你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。
示例 1:
输入:n = 13
输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]
示例 2:
输入:n = 2
输出:[1,2]
说明:
- 1 <= n <= 5 * 10^4
思路
将 1 ~ n
的所有整数按照字典序排序,要求时间复杂度为 O(n)
,空间复杂度为 O(1)
。
想象遍历一颗字典树,优先扩展(乘以 10),如果超过 n
,则优先将个位数加一(遍历兄弟节点),如果需要进位,则返回父节点(除以10)并将个位数加一(父节点的兄弟节点),接着执行同样的逻辑,扩展,个位数加一,回退。
代码
/**
* @date 2025-06-08 18:15
*/
public class LexicalOrder386 {
public List<Integer> lexicalOrder(int n) {
List<Integer> res = new ArrayList<>();
for (int i = 0, j = 1; i < n; i++) {
res.add(j);
if (j * 10 <= n) {
j *= 10;
} else {
while (j % 10 == 9 || j >= n) {
j /= 10;
}
j++;
}
}
return res;
}
}