题目链接:字典序排数
题目描述:
给你一个整数 n
,按字典序返回范围 [1, n]
内所有整数。
你必须设计一个时间复杂度为 O(n)
且使用 O(1)
额外空间的算法。
思路一:递归
js代码如下:
var lexicalOrder = function (n) {
let arr = [];
backtrack(1, n);
function backtrack(num, n) {
if (num > n)
return;
arr.push(num);
backtrack(num * 10, n);
let end;
if (num == 1)
end = 9 > n ? n : 9;
else
end = num + 9 > n ? n : num + 9;
for (let i = num + 1; i <= end; i++) {
arr.push(i);
backtrack(i * 10, n);
}
}
return arr;
};
每个数字遍历一遍,时间复杂度为O(n),忽略递归所用的空间复杂度,为O(1)。
思路二:迭代
进行n次循环,每次循环将number加入数组,
若number*10<=n,则number*=10,即在后面补0,位数+1;
否则应该number++,number++的截止是最后一位数为9,或number+1>n。此时number应该位数减1,去掉最后一位。
js代码如下:
var lexicalOrder = function (n){
let arr=[];
let number=1;
for(let i=0;i<n;i++){
arr.push(number);
if(number*10<=n){
number*=10;
}else{
while(number%10==9 || number+1>n)
number=Math.floor(number/10);
number++;
}
}
return arr;
}
时间复杂度为O(n),空间复杂度严格为O(1)。