给定一个整数 n, 返回从 1 到 n 的字典顺序。
例如,
给定 n =13,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。
请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。
从1开始 接着是10 100 然后在最低位累加 101 102 103 一直到最低位为9 就退一位加1 ->110
退位加完后继续重复这个过程
class Solution {
public List<Integer> lexicalOrder(int n) {
List<Integer> res = new ArrayList<Integer>();
int cur = 1;
for(int i = 1;i <= n;i++){
res.add(cur);
if(cur * 10 <= n){
cur = cur * 10;
}
else if(cur % 10 != 9 && cur + 1 <= n){
cur++;
}
else{
while ((cur / 10) % 10 == 9) {
cur = cur / 10;
}
cur = cur / 10 + 1;
}
}
return res;
}
}
还有用递归思想的
class Solution {
public List<Integer> lexicalOrder(int n) {
List<Integer> res = new ArrayList<Integer>();
for(int i = 1;i <= 9;i++){
getNum(i,n,res);
}
return res;
}
private void getNum(int num,int n,List<Integer> res){
if(num > n)
return;
res.add(num);
num *= 10;
for(int i = 0;i <= 9;i++){
getNum(num + i,n,res);
}
}
}