440_字典序的第K小数字
难度:困难
题目
给定整数 n 和 k,返回 [1, n] 中字典序第 k 小的数字。
示例
示例一:
输入: n = 13, k = 2
输出: 10
解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。
示例二:
输入: n = 1, k = 1
输出: 1
提示
- $1 <= k <= n <= 10^9$
解题

可以参照上图来理解
- 初始化前缀为 1,计算以 1 为前缀的所有子树节点树木,如果小于 k ,说明当前子树的节点数不够,向右移动变为 2,如果大于 k ,说明答案就在当前根节点的子树节点,向下移动 变为 10
- k 减去已经遍历过的节点个数,以当前为根节点,直到 k=0
第一层节点数为: 1 = nextPrefix - prefix; | 2 - 1
第二层的节点数为10 = nextPrefix - prefix; | (2 * 10) - (1 * 10)
…由于最后一层可能出现结点不满的情况,所以要取 总结点数 - prefix 与 nextPrefix - prefix的最小值,即:
第n层的节点数为:Math.min (k - prefix , nextPrefix - prefix); | k - (1 * 10^n) 、(n * 10^n) - (1 * 10^n)
于是对于每一层的节点数,直接用一个式子表示:Math.min (k - prefix , nextPrefix - prefix)
1 | |