leetcode 386. 字典序排數
阿新 • • 發佈:2019-01-26
給定一個整數 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 ;
}
};