leetcode_440. 字典序的第K小数字

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。

注意:1 ≤ k ≤ n ≤ 109。

示例 :

输入:
n: 13   k: 2

输出:
10

解释:
字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。

二、解题思路

十叉树,那么,满十叉树包括根节点10个子节点一共11个节点,因此进入子树的方法是根节点*10然后依次加1,判断k和当前子树节点个数:

如果k大于子树节点个数,则进入兄弟节点,也就是加1,并且k减当前子树节点个数(满的话减10);

如果k小于等于子树节点个数,则*10进入子节点,并且k减1。

三、代码

class Solution:
    def findKthNumber(self, n: int, k: int) -> int:
        cur = 1
        while k > 1:
            left = cur
            right = cur + 1
            num = 0
            # 统计这棵子树下所有节点数(num)
            while left <= n:
                num += min(right, n + 1) - left
                left *= 10
                right *= 10
            if num < k:#不在子树中
                cur += 1
                k -= num
            else:#在子树中,进入子树
                cur *= 10
                k -= 1
        return cur



if __name__ == '__main__':
    n = 13
    k = 5

    s = Solution()
    ans = s.findKthNumber(n, k)
    print(ans)
悲恋花丶无心之人 CSDN认证博客专家 深度学习 神经网络 Pytorch
计算机视觉在读研究生,熟悉Pytorch,MXNet,TensorFlow,Keras等深度学习框架,主要涉及的领域有目标检测,语义分割,超分辨率重建,行人重识别等。
个人GitHub网址为:https://github.com/nickhuang1996
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值