Thought
当我们按照例子上想找到13的第2个最小的数字的时候,我们首先回去找数字1: 1 10 11 12 13
然后找到10,也就是说我们首先需要知道:
- 1 ->
1 10 11 12 13
- 2 ->
2 20 21 22 23
- …
- N ->
N N0 N1 N2 N3
我们可以构建出来树:
1 | root |
$关键点在于$:如何跳过整个子树
我们从 curr = 1
开始,尝试不断跳到字典序下一个数字。如果当前子树(比如以 curr = 1
开头的所有数字:1,10,11,…19…)的节点数少于 k
,说明第 k
小不在这个子树,可以整体跳过
通过这个函数来计算出, 以 prefix(1)
为前缀的所有数字中, <=n
的个数
1 | def getCount(prefix: int, n: int) -> int: |
getCount(1, 13) => len(1 10 11 12 13) => 5
if count <= k:
这里 count=5 > k=1
,说明我们要找的第 k 小数字 在 curr=1 的子树里
curr *= 10 # curr = 10
k -= 1 # k = 0
现在我们走到了 curr = 10,k 也变成了 0,说明我们已经找到了第 k 小的数字。
Answer
1 | class Solution: |