题目:
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.
思路:
由于之前做过相关的题目。原本以为这道题是很简单的字典序排序但是被这道题后面的那句话(Please optimize your algorithm to use less time and space.)打脸了。
这道题用到了非常巧妙的排序解法。我们可以通过组合数据的方式解决这道题。任何数据都是以[0, 9]开头的,由于此题的最小值是1,所以这个区间是[1, 9]。
之后是递归函数的设计,递归需要满足的第一个条件就是跳出,一旦咱们组合的数(target)大于输入的值n的时候就跳出递归。之后就是组数操作,设置一个循环,范围从0~10,之后target乘上10并加上循环的指数[0, 10]。在进行调用自身函数的操作。这是递归需要满足的第二个条件。
代码:
/**
* Lexicographical Order
* @param n
* @return
*/
public List<Integer> lexicalOrder(int n) {
List<Integer>result = new ArrayList<Integer>();
for(int i=1;i<10;i++){
recursive(result, i, n);
}
return result;
}
private void recursive(List<Integer> list, int target, int num){
if(target>num){
return;
}
list.add(target);
for(int i=0;i<10;i++){
recursive(list, target*10 + i, num);
}
}