Leetcode0440. 字典序的第K小数字(difficult,三种算法)
目录
1. 题目描述
2. 解题分析
2.1 作弊的解法
2.2 哈希+减而治之
2.3 字典树
3. 代码实现
1. 题目描述
给定整数 n
和 k
,返回 [1, n]
中字典序第 k
小的数字。
示例 1:
输入: n = 13, k = 2 输出: 10 解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。
示例 2:
输入: n = 1, k = 1 输出: 1
提示:
1 <= k <= n <= 10^9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题分析
2.1 作弊的解法
利用Python的强大的内置字符串处理能力,这个问题的解决极其简单。
Python提供了内置的字符串排序方法,对字符串排序就是按字典序排序。
先将数字转换为字符串,然后按照字符串排序,最后在取字典序排序的第k个转换回数字即可。
但是,这种方法因为需要将所有的数先变换成字符串然后再一起进行排序处理,仅限于数据量比较小时可用。题设要求n最大可达10**9,首先内存需求就非常大,字符串排序也非常耗时,无法满足leetcode的复杂度评估要求。但是这个实现可以作为一个参考,代码参见以下findKthNumber1()。
2.2 哈希+减而治之
按字典序排序,就是首先看各数的最高位,如果最高位相同,则看次高位,。。。,然后依此类推。
所以考虑这样一个基本的思路:按照目标数的最高位、次高位。。。的顺序逐步确定。
首先建立一个哈希表。以数的最高位为key,最高位为该key的数的列表作为value。
这个表就代表了对原数组的一个按字典序分区间排序。每区间之内的数暂时还不是按字典序排列的。基于这个表中各区间的元素个数,并与k做对比,很容易确定目标数应该处于哪个区间。
然后,针对该区间的数重新进行以上处理,这样逐步缩小范围最终就可以找到目标数。
代码参见以下 findKthNumber2().
满以为这个操作很秀。。。然而,这个算法得速度居然比上一个解法还要慢,很受伤^-^
2.3 字典树
对于这个搜索的结构隐约有点想法,但是。。。嗯,不打算再死磕了。偷窥了一下官解,字典树!原来如此。没有学习过字典树(惭愧,不过这下就算学习过了),难怪想不到。。。(给我足够多的时间去死磕,是不是也能重新“发明”出字典树这种数据结构来呢?回过头来看,其实解法2已经孕育了字典树的雏形了
Leetcode0440. 字典序的第K小数字(difficult,三种算法)相关推荐
- 440. 字典序的第K小数字
440. 字典序的第K小数字 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 109. 示例 : 输入: n: 13 k: 2 输出: 10 解释: ...
- 【字节跳动面试题】字典序的第K小数字
字典序的第K小数字 class Solution {public:typedef long long ll;ll count(ll a, ll n) {ll b = a + 1, cnt = 0;fo ...
- LeetCode440. 字典序的第K小数字
给定整数 n 和 k,返回 [1, n] 中字典序第 k 小的数字. 题目很简单,但是题本身并不简单. LeetCode440. 字典序的第K小数字 一.偷懒技巧 一个偷懒的技巧是将数字转化为字符串, ...
- leetcode-440 字典序的第K小数字
给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 10^9. 示例 : 输入: n: 13 k: 2 输出: 10 解释: 字典序的排列是 [1, 10 ...
- 计算字典的个数_[LeetCode] 440. 字典序的第K小数字
题目链接: https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order 难度:困难 通过率:28.4% 题目描述: ...
- LeetCode —— 440. 字典序的第K小数字(Python)
给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 示例 : 输入: n: 13 k: 2 输出: 10 解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4 ...
- leetcode 440. 字典序的第K小数字(精)
题目: 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 109. 示例 : 输入: n: 13 k: 2 输出: 10 解释: 字典序的排列是 [1, ...
- 解决寻找第K小元素问题——三种不同的算法实现
个人原创,禁止转载--Zetrue_Li 问题描述:在一个序列里找出第K小元素 以下程序基于函数 int select_kth_smallest(list q, int k) 实现 :返回向量q中第k ...
- D22 LeetCode 440.字典序的第K小数字(困难)
一.题目 二.思路(自己) 题目要求是字典序排列,即按照字符串比较一样进行排列,前几天刚好面过类似的题,为了降低时间复杂度,我们可以采用红黑树进行排序. 使用TreeSet来存储里面的数组,重写比较器 ...
最新文章
- 面试题总结-算法部分
- Groovy—沉睡的雄狮
- js进阶 13-6 jquery动画效果相关常用函数有哪些
- 【java8新特性】——默认方法(五)
- 作者:房毓菲(1990-),女,就职于国家信息中心信息化研究部,中国智慧城市发展研究中心政策研究组副组长。...
- android 加载外部矢量图SVG
- 【蓝桥杯单片机】【51拓展】PCA寄存器配置实现硬件输出PWM
- Java自动化测试框架-08 - TestNG之并行性和超时篇 (详细教程)
- java打包成jar文件
- dubbo k8s 服务发现_Dubbo-go 发布 1.5 版,朝云原生迈出关键一步
- axure删除的页面怎么恢复_Axure高保真还原Web首页布局和交互教程
- 5.8G微波雷达模块使用,5.8G微波雷达模块工作原理和介绍
- DelayQueue 分析
- 每日新闻丨​iPhone11成败关系全球众多供应商下一张饭票
- 《Machine Learning in Action》—— Taoye给你讲讲Logistic回归是咋回事
- 骗子网站--正规网赚系统--www.j9m2.com--诈骗网站
- Python爬虫——爬虫是什么都可以爬的吗?Robots协议!
- python求和:1/3+3/5+5/7+7/9+...+97/99
- 照度/感光度(Lux)
- font-face使用的web字体格式介绍、浏览器兼容和字体转换