题目描述
 
给定一个整数 n, 返回从 1 到 n 的字典顺序。
 
例如,
 
给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。
 
请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。
 
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lexicographical-numbers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 
这个题最容易出错的地方在于第一轮循环的时候要考虑最高位为零的情况怎么处理
 
递归解法
 
class Solution {
    public List
<Integer> lexicalOrder(int n
) {
        List
<Integer> result 
= new ArrayList<>();
        
        getRes(result
, 0, n
, 0);
        return result
;
    }
    public static void getRes(List
<Integer> result
,Integer currentValue
,int maxNum
, int pre
) {
        if(currentValue 
<= maxNum 
){
            if(currentValue 
!=0){result
.add(currentValue
);}
            for(int nextBit 
= pre 
> 0 ? 0 : 1; nextBit 
<= 9;nextBit
++){
                if(pre 
== 0) pre
++;
                getRes(result
,currentValue
*10+nextBit
,maxNum
, pre
);
                }    
        }
    }
}
 
DFS
 
class Solution {
    public List
<Integer> lexicalOrder(int n
) {
        ArrayList
<Integer> result 
= new ArrayList<>();
        for (int i 
= 1; i 
< 10; i 
++){
            dfs(result
,i
, n
);
        }
        return result
;
    }
    private void dfs(List
<Integer> result
,int currentValue
, int maxNum
){
        if (currentValue 
> maxNum
) return;
        result
.add(currentValue
);
        for (int nextBit 
= 0; nextBit 
< 10; nextBit 
++) {
            dfs(result
, currentValue 
* 10 + nextBit
, maxNum
);
        }
    }
}