K-th Smallest in Lexicographical Order

一开始用递归想起了一个方法。当前的前缀是X,那么后续有1~9个备选后缀,然后分别递归。结果ETL,那么肯定知道要剪枝。也知道每个前缀对应的小于n的选项肯定是一定的。如何组织这个剪枝的思路呢?

看了discuss才明白了。所有的候选集实际上构成了一个十叉树。超时的思路是一种preOrder的遍历方法。
我们可以统计子树的节点数量,来判断要不要对这个子树进行遍历。
统计子树的数量,首先我们得到子树的根节点对应的前缀。这是一个节点。然后前缀对应的值val,乘以10, 如果小于n,那么这10个数肯定都在子树上。再乘10,得到100,如果小于n,那么子树又包括这100个节点。知道num = 10^x, 大于n。而我们知道,n 肯定在 val 10^(x-1) 到 val 10^(x) 之间。而扩大x-1倍的到的最大值为val * 10 ^(x-1) + 10^(x-1) - 1, 如果小于这个数,则应该再减去最大值减去 n。因为多算了。