转为string:
class Solution {
public:
vector<int> lexicalOrder(int n) {
vector<string> a(n);
for(int i = 1; i <= n; ++i) a[i-1] = to_string(i);
sort(a.begin(), a.end());
vector<int> res;
for(auto v : a) res.push_back(stoi(v));
return res;
}
};
效率一般,空间复杂度较高
想到转化为string后使用字典树的思路,可以不用排序,但是空间复杂度也不低。
使用map的自动排序:
class Solution {
public:
vector<int> lexicalOrder(int n) {
map<string, int> nums;
for(int i = 1; i <= n; ++i) nums[to_string(i)] = i;
vector<int> res;
for(auto v : nums) res.push_back(v.second);
return res;
}
};
dfs遍历:
class Solution {
public:
void dfs(int k, int n, vector<int>& res) {
if (k > n) return;
if (k != 0) res.push_back(k);
//依次考虑1、2、3...开头的数字
for(int i = 0; i <= 9; ++i){
if(10*k + i > 0)//避免0一直循环
dfs(10*k+i, n, res);
}
}
vector<int> lexicalOrder(int n) {
vector<int> res;
dfs(0, n, res);
return res;
}
};
换个写法:
class Solution {
public:
vector<int>res;
vector<int> lexicalOrder(int n) {
for ( int i = 1 ; i <= 9 ; i++)
dfs(i,n);
return res;
}
void dfs(int x,int n){
if (x>n) return;
res.push_back(x);
for ( int i = 0 ; i <= 9 ; i++)
dfs(x*10+i,n);
}
};