LeetCode 之路

LeetCode 386——字典序的第 K 小数字

2019-03-27  本文已影响2人  seniusen

1. 题目

2. 解答

字典序排数可以看做是第一层节点分别为 1-9 的十叉树,然后我们在树上找到第 K 小的数字即可。因此,我们需要分别统计以 1-9 为根节点的每个树的节点个数。如果 K 小于当前树的节点个数,那么第 K 小的数字即在当前树中,我们进入子树继续查找;如果 K 大于当前树的节点个数,那么我们需要查找后面树中第 (K - 当前树节点) 小的数字。

其中,比较关键的步骤就是统计树中的节点个数,我们按照逐层统计的方法来进行,详见下图。

假设我们统计完第一棵树的节点数为 node_num

最后当 K=0 时,cur 指向的值即为所求。

class Solution {
public:
    int findKthNumber(int n, int k) {
        
        int cur = 1;
        k--;
        
        while (k > 0)
        {
            long long left = cur;
            long long right = cur + 1;
            int node_num = 0;
            
            while (left <= n) // 统计树中每一层的节点个数
            {
                node_num += min(right, (long long)(n+1)) - left;
                left *= 10;
                right *= 10;
            }
            
            if (node_num <= k) // 向后查找
            {
                k -= node_num;
                cur++;
            }
            else // 进入子树查找
            {
                k--;
                cur *= 10;
            }
        }
        
        return cur;       
    }
};

获取更多精彩,请关注「seniusen」!

上一篇下一篇

猜你喜欢

热点阅读