386. 字典序排数(2022-4-18)
给你一个整数 n
,按字典序返回范围 [1, n]
内所有整数。
你必须设计一个时间复杂度为 O(n)
且使用 O(1)
额外空间的算法。
示例 1:
示例 2:
提示:
- 1 <= n <= 5 * 104
解题思路
此题类似于440. 字典序的第K小数字,相当于前置题,如果这个题写出来了,倒也可以挑战一下440.
首先是想到了API大法,sort
默认是字典序的,所以用一个[1,n]
的数组直接sort就OK了;先把数组填充好,然后sort;或者直接一行解决!用map和索引填充数组。
正解的话就是DFS了,把1后边的10、11等看作节点1的子树,然后进行「前序遍历」,也就是深搜;把1开头的遍历完,再开始2开头的(差不多是这么个意思)
插一句,440也是用的深搜去确定当前数的位置,然后逐步找到第k位。
var lexicalOrder = function(n) {
let ret = new Array(n)
for(let i = 1; i <= n; i++){
ret[i-1] = i
}
return ret.sort()
// 或者一行解决
return new Array(n).fill(0).map((v,i) => i + 1).sort()
// 再或者来个正经的DFS
let cur = 1,ret = []
for(let i = 0; i < n; i++){
ret.push(cur)
if(cur * 10 <= n) cur *= 10
else{
while(cur % 10 == 9 || cur >= n) cur = (cur/10) | 0
cur++
}
}
return ret
}