Description:
Given an integer n, return 1 - n in lexicographical order.
Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000.
Example:
For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].
Link:
https://leetcode.com/problems/lexicographical-numbers/#/description
解题方法:
回溯法:
这道题先生成数字在排序是行不通的,所以要采用边生成数字边排序的方法。
譬如给出的例子n = 13
,当生成13
以后,需要回溯到2
。
所以这道题可以使用递归做。
首先定义如何生成数字:数字分为两部分,self
和add
,self
定义着一个数的层数(比如1,2,3都是同一层,self
都是1,都是个位数这一层);add
为加数,self + add
才构成了同一层的不同数。
递归的构成:
参数:self初始化为0
,add初始化为1
,int n
,返回数组
。
出口:当self > n || add > 9 || self + add > n
,return掉
;
递归函数体:先往下一层递归,即下一层的self = (self + add) * 10
,add
从0
开始;然后再往同层数不同数递归,即self
不变,add++
。
Time Complexity:
O(N)
完整代码:
class Solution
{
public:
vector lexicalOrder(int n)
{
vector result;
if(n == 0)
return result;
lexi(0, 1, n, result);
return result;
}
void lexi(int self, int add, int n, vector& result)
{
if(self > n || add > 9 || self + add > n)
return;
result.push_back(self + add);
lexi((self + add) * 10, 0, n, result);
lexi(self, add + 1, n, result);
}
};