题目描述
给定一个整数 n, 返回从 1 到 n 的字典顺序。
例如,
给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。
请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。
解题思路
class Solution {
public:
static bool cmp(int a,int b){
string sa = to_string(a);
string sb = to_string(b);
int i = 0,la = sa.length(),lb = sb.length();
while(i<la && i<lb){
if(sa[i] == sb[i]) i++;
else if(sa[i] < sb[i]) return true;
else return false;
}
if(i>=la) return true;
return false;
}
vector<int> lexicalOrder(int n) {
vector<int> ans;
for(int i=1;i<=n;i++) ans.push_back(i);
sort(ans.begin(),ans.end(),cmp);
return ans;
}
};
DFS:
class Solution {
public:
void dfs(int start,int &idx,int n,vector<int>& ans){
ans[idx++] = start;
for(int i=0;i<=9;i++){
if(start*10+i <= n) dfs(start*10+i,idx,n,ans);
}
}
vector<int> lexicalOrder(int n) {
vector<int> ans(n);
int idx = 0;
for(int i=1;i<=9;i++){
if(i <= n) dfs(i,idx,n,ans);
}
return ans;
}
};