Solution:
The idea is to think in a "tree" like structure: the root is 0, then its leaves are from 1 to 9; then for the next layer, each element from the upper layer will has 10 leaves, respectively. For example, for 1 as the root, the 10 leaves for it will be 10, to 19; for 2 as the root, the 10 leaves will be 20 to 29; ... Then we just need to travel this "virtual tree" recursively by root-first and leaves-second way.
However, we may don't need to build a tree for this question, and we can do this in vector. But the idea is similar. Firstly, we will put 1-9 into the vector. Then we will iterate the vector from the beginning. For 1, we will add 10-19 after it; for 2, we will add 20-29 after it; ... Of course, all the newly added elements need to be no larger than n. See code below.
We can also use a queue structure to implement this. So the algorithm involved is some sort of BSF fashion.
Code:
class Solution {
public:
vector<int> lexicalOrder(int n) {
vector<int> res;
int l = min(n, 9);
for(int i=1; i<=l; ++i) res.push_back(i);
if(n>9){
vector<int> t;
int layer = 1;
while(res.size()<n){
for(auto a:res){
t.push_back(a);
if(a>=layer && a*10<=n){
for(int j=0; j<=9; ++j){
int val = a*10 + j;
if(val<=n) t.push_back(val);
else break;
}
}
}
layer *=10;
res.clear();
res = t;
t.clear();
}
}
return res;
}
};
No comments :
Post a Comment