class Solution:
# 完全十叉树,而不是满十叉树,因此需要考虑边界情况
# 深度遍历找到最小子孙节点
def findKthNumber(self, n: int, k: int) -> int:
# 计算给定节点的孩子节点的个数
def count(c1, c2, n):
# c2比c1大1
steps = 0
while c1 <= n:
steps += min(n + 1, c2) - c1
c1 *= 10
c2 *= 10
return steps
cur = 1 # 字典序从1开始
k -= 1 # 去掉第一个数1
while k > 0:
steps = count(cur, cur + 1, n)
# 第 m 个节点不在自身和孩子节点,则应该跳过所有孩子节点,直接到兄弟节点
if steps <= k:
cur += 1 # 跳过所有孩子节点,直接到兄弟节点就是 x + 1
k -= steps
# 第 m 个节点在其孩子节点中,我们需要深入到子节点
else:
cur *= 10 # 深入到子节点就是 x * 10
k -= 1
return cur
440. 【1 ~ N 中】字典序的第 K 小数字(Hard)
于 2021-07-20 01:11:35 首次发布