1. 程式人生 > >leetcode 386. 字典序排數

leetcode 386. 字典序排數

給定一個整數 n, 返回從 1 到 n 的字典順序。

例如,

給定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。

請儘可能的優化演算法的時間複雜度和空間複雜度。 輸入的資料 n 小於等於 5,000,000。

這道題直觀的想法是,建一個vector<int>,和一個vector<string>,int轉換到string,排序後再轉回int,空間複雜度為O(N),時間複雜度為O(N*lgN)。但是還要加上to_string和stoi的開銷,還是蠻大的。

略加思索,可以用DFS,優先擴充套件深度,即可得到1,10,100,101,11,110…………的排序。
程式碼如下:

class Solution {
public:
    vector<int> lexicalOrder(int n) {
        vector<int>work;
        for(int i=1;i<=9;++i){
            if(i<=n){
                work.push_back(i);
                helper(work,n,i*10);
            }else{
                break;
            }
        }
        return
work; } void helper(vector<int>&work,int n,int sum){ for(int i=0;i<=9;++i){ int tmp=sum+i; if(tmp<=n){ work.push_back(tmp); helper(work,n,tmp*10); }else{ break; } } return
; } };