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.
此题,观察数字,可看出具有递归形式,因此采用递归的方式。每层对上层给定的数字下一位组合十个数字进行递归,如10~19,判断大于给定的数值即返回。输入应从0开始,但单个0数字直接返回不计入数组
代码如下:
class Solution {
public:
vector<int> v;
void lex(int t,int n){
if( t <= n){
int i = 0;
if(t == 0 && i == 0){
i = 1;
} else{
Solution::v.push_back(t);
}
while(i < 10) {
if(t*10 +i > n) return ;
lex(t*10 +i,n);
i++;
}
}
return ;
}
vector<int> lexicalOrder(int n) {
lex(0,n);
return Solution::v;
}
};
第二种解法参考网友给出的:
1、从1开始迭代,若1与0组合在范围内计入数组
2、否则,若大于则去除0,且加一,接着判断若加一后进位了则去除0(这里如若999+1==1000则循环判断除去0)
3、从步骤一开始循环n次
代码如下:
class Solution {
public:
vector<int> lexicalOrder(int n) {
vector<int> res(n);
int cur = 1;
for (int i = 0; i < n; i++) {
res[i] = cur;
if (cur * 10 <= n) {
cur *= 10;
} else {
if (cur >= n)
cur /= 10;
cur += 1;
while (cur % 10 == 0)
cur /= 10;
}
}
return res;
}
};
我的算法复杂度应当近似于该算法O(n)的复杂度,对有效的数据只进行了一次运算,然而因为是递归调用所以我的运行时间大致比该算法慢了一般时间