今天刷了一道很有意思的题,leetCode404
题目给出的描述如下
刚开始看的时候,感觉毫无头绪,因为不太懂字典序是个啥。后来battle了好久,终于还是忍不住去看了看题解,才发现,字典序原来就是按照字符串的规则去排序呀!
思路如下:我们取1-n中的任意一个数v。我们可以发现。按照字典序来的话。它下一个数应当是v*10(如果v*10小于等于n的话),反之则为v+1。 下下个数为v*10*10(如果v*10*10小于等于n的话)。根据这个规律我们很明显可以想到度为10的完全树中,根节点和它的最左边的直接子节点也是这样的规律。由此我们可以将n个数组成一颗1度为10的数
假设我们目前找到第i个数。我们要知道第k个数字在那。首先我们可以想到前序遍历。但是这样会超出时间限制。前序遍历的代码如下
因此我们得换个思路。我们可以发现。字典树中每个节点的值都是存在规律的。层序遍历的时候,每一层节点的值是依次递增的,每一层最右边的节点值等于 上一层最右边的值乘以10加9,最左边的值等于上一层最左边的值乘以10。按照这个规律,我们可以一层一层的很快的统计出以当前节点为根的树上的节点个数。再根据节点个数与当前的k值比较,判断出下一步我们应该到哪个节点上去,同时更新k值。这样我们就可以根据数学规律大面积的排除不合适的节点。而前序遍历是一个一个去排查。所以显然我们后面的这种方法是要优于前序遍历的
代码如下