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