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。

解题思路

N个数字可以组织成为具有n个节点的10叉树,该树的前序遍历就是数字的字典序,如图所示

我们的目标就是需要找前序遍历的第k个节点

我们可以选择性的选择父节点遍历,不需要遍历前k个节点。

例如

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

我们可以通过计算出,以1开头有多少个节点,对比和k的关系。

  1. 以1为根节点的子树节点数量为5,如果k为6,说明不需要遍历以1为根节点的树,直接向左移动到以2为根节点的树上,继续遍历
  2. 以1为根节点的子树节点数量为5,如果k为2,说明我们需要遍历的节点必然在根节点1的子树上面,我们移动到根节点的最左子节点,继续遍历

如何计算子树的节点树

从上图可以观察出,每一层节点的数字都是单调递增的,例如10,11…19,20,因此我们通过计算根节点的最左节点来固定每一层的节点数

每一层我们需要计算的节点数,位于上图红线划分的区间中。

代码

class Solution {public int findKthNumber(int n, int k) {long cur=1;k--;while (k>0){int number = findingKthNumber(n, cur);if (k>=number){k-=number;cur++;}else {k--;cur*=10;}}return (int)cur;}//sum 上一层的数字public int findingKthNumber(int n, long cur) {long next=cur+1;long res=0;while (cur<=n){res+= Math.min(n-cur+1,next-cur);cur*=10;next*=10;}return (int)res;}
}

440. 字典序的第K小数字相关推荐

  1. 计算字典的个数_[LeetCode] 440. 字典序的第K小数字

    题目链接: https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order 难度:困难 通过率:28.4% 题目描述: ...

  2. LeetCode —— 440. 字典序的第K小数字(Python)

    给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 示例 : 输入: n: 13 k: 2 输出: 10 解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4 ...

  3. leetcode 440. 字典序的第K小数字(精)

    题目: 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 109. 示例 : 输入: n: 13 k: 2 输出: 10 解释: 字典序的排列是 [1, ...

  4. D22 LeetCode 440.字典序的第K小数字(困难)

    一.题目 二.思路(自己) 题目要求是字典序排列,即按照字符串比较一样进行排列,前几天刚好面过类似的题,为了降低时间复杂度,我们可以采用红黑树进行排序. 使用TreeSet来存储里面的数组,重写比较器 ...

  5. 【字节跳动面试题】字典序的第K小数字

    字典序的第K小数字 class Solution {public:typedef long long ll;ll count(ll a, ll n) {ll b = a + 1, cnt = 0;fo ...

  6. LeetCode440. 字典序的第K小数字

    给定整数 n 和 k,返回 [1, n] 中字典序第 k 小的数字. 题目很简单,但是题本身并不简单. LeetCode440. 字典序的第K小数字 一.偷懒技巧 一个偷懒的技巧是将数字转化为字符串, ...

  7. leetcode-440 字典序的第K小数字

    给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 10^9. 示例 : 输入: n: 13 k: 2 输出: 10 解释: 字典序的排列是 [1, 10 ...

  8. Leetcode0440. 字典序的第K小数字(difficult,三种算法)

    目录 1. 题目描述 2. 解题分析 2.1 作弊的解法 2.2 哈希+减而治之 2.3 字典树 3. 代码实现 1. 题目描述 给定整数 n 和 k,返回 [1, n] 中字典序第 k 小的数字. ...

  9. Leetcode 440.字典序第k小的数字

    字典序第k小的数字 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 109. 示例 : 输入: n: 13 k: 2 输出: 10 解释: 字典序的排 ...

最新文章

  1. linux下 get,Unix/Linux下 getrusage 的用法
  2. IE滤镜实现透明度/阴影/渐变等特效
  3. 为什么是get()和set()方法?
  4. python调用kafka拉取数据失败_无法使用kafkapython从另一个容器向Kafka容器发出请求...
  5. php mysql_connect 不支持_php mysql_connect不支持的解决方法
  6. 松下壁挂式新风系统推荐_壁挂式新风系统哪个好?
  7. JavaScript 中的闭包和作用域链(读书笔记)
  8. 『重构--改善既有代码的设计』读书笔记----Split Temporary Variable
  9. 阿里扔给腾讯一个烫手山芋
  10. 转移服务器显示乱码,两台服务器之间数据传输乱码问题
  11. 软考中级软件设计师---下午题
  12. C语言学习笔记->const和define区别
  13. 【科研绘图】沐风老师3DMAX极小曲面建模教程
  14. vue-router
  15. ysdk应用宝渠道接入问题记录
  16. Instant Contiki
  17. GAGE USB信号采集卡
  18. 【数学问题2】向量微分
  19. 1.2样本空间和随机事件
  20. mxgate是gpcopy同步速度的2倍

热门文章

  1. Linux socket编程(二) 服务器与客户端的通信
  2. Linux下Kill函数用法
  3. S3C2440扩展SDRAM
  4. 【数据库】数据模型基础概念(图文版)
  5. Java NIO Channel
  6. Java面试题及答案,java对外提供接口
  7. 如何化身BAT面试收割机?不吃透都对不起自己
  8. 基础总结篇之中的一个:Activity生命周期
  9. 暑期项目经验(九) -- request session application
  10. C/C++查找一定范围内的素数(筛法)