Given an integer n, return 1 - n in lexicographical order.
For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].
Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000.
参考资料:here。
参考资料已经讲得非常好了,我们这里贴出递归和迭代两种实现方式。
递归实现:
class Solution {
private:
vector<int> ans;
int n;
void helper(int m) {
ans.push_back(m);
if (m * 10 <= this->n) helper(m * 10);
if (m + 1 <= this->n && (m % 10 < 9)) helper(m + 1);
}
public:
vector<int> lexicalOrder(int n) {
this->n=n;
helper(1);
return ans;
}
};
迭代实现:
class Solution {
public:
vector<int> lexicalOrder(int n) {
stack<int> s;
s.push(1);
vector<int> ans;
while (!s.empty()) {
int tmp = s.top(); s.pop();
ans.push_back(tmp);
if (tmp < n && tmp % 10 < 9) s.push(tmp + 1);
if (tmp * 10 <= n) s.push(tmp * 10);
}
return ans;
}
};