440. 字典序的第K小数字 + 字典树 + 前缀 + 字典序
440. 字典序的第K小数字
LeetCode_440
题目描述
方法一:暴力法(必超时)
package com.walegarrett.interview;
/**
* @Author WaleGarrett
* @Date 2021/2/25 19:49
*/
/**
* 题目描述:给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。
* 注意:1 ≤ k ≤ n ≤ 109。
*/
import java.util.Arrays;
/**
* 解法一:使用暴力法
*/
public class LeetCode_440 {
public int findKthNumber(int n, int k) {
String[] result = new String[n];
for(int i=1;i<=n;i++){
String now = String.valueOf(i);
result[i-1] = now;
}
Arrays.sort(result);
return Integer.parseInt(result[k-1]);
}
}
方法二:思维
/**
* 方法二:使用字典树
*/
class LeetCode_440_2 {
public int findKthNumber(int n, int k) {
long prefix = 1;
long cntK = 1;
/**
* 以下的实现基于一个事实:所有前缀相同的元素肯定都在一起,或者说在一个连续的区间。
* 解题的关键就是先找到对应的区间,然后找到区间的某一个值。
*/
while(cntK<k){
//获取某个前缀的所有序列字典序
long cnt = getCount(prefix, n);
if(cntK+cnt>k){
/**
* 说明以数字i开头的数字串太多了,并且第k个数字一定是以数字prefix开头。
* 此时数字prefix更新为10*i,缩小搜索范围。
* 位置p向前移动一位,因为新数字i字典序向后移动一位了。
*/
prefix*=10;
cntK++;
}else if(cntK+cnt<=k){
/**
* 说明将以数字prefix开头的数字串都算进去,也不够。
* 说明数字prefix要增加到prefix+1。
* 同时,位置p要跨过count个数字。
*/
prefix++;
cntK += cnt;
}
}
return (int)prefix;
}
//获取某个前缀的所有序列的字典序
long getCount(long prefix, long n){
long cnt = 0;
for(long a=prefix,b=prefix+1; a<=n; a*=10,b*=10){
cnt+=Math.min(b, n)-a;
}
return cnt;
}
}
440. 字典序的第K小数字 + 字典树 + 前缀 + 字典序的更多相关文章
- Java实现 LeetCode 440 字典序的第K小数字
440. 字典序的第K小数字 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 109. 示例 : 输入: n: 13 k: 2 输出: 10 解释: ...
- 440 K-th Smallest in Lexicographical Order 字典序的第K小数字
给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字.注意:1 ≤ k ≤ n ≤ 109.示例 :输入:n: 13 k: 2输出:10解释:字典序的排列是 [1, 10, 11, 1 ...
- [Swift]LeetCode440. 字典序的第K小数字 | K-th Smallest in Lexicographical Order
Given integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n. N ...
- LeetCode 386——字典序的第 K 小数字
1. 题目 2. 解答 字典序排数可以看做是第一层节点分别为 1-9 的十叉树,然后我们在树上找到第 K 小的数字即可.因此,我们需要分别统计以 1-9 为根节点的每个树的节点个数.如果 K 小于当前 ...
- 字典序的第K小数字
今天zyb参加一场面试,面试官听说zyb是ACMer之后立马抛出了一道算法题给zyb:有一个序列,是1到n的一种排列,排列的顺序是字典序小的在前,那么第k个数字是什么?例如n=15,k=7, 排列顺序 ...
- 9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第9章 查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚 ...
- bzoj 3065: 带插入区间K小值 替罪羊树 && AC300
3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1062 Solved: 253[Submit][Status] Des ...
- spoj COT - Count on a tree (树上第K小 LCA+主席树)
链接: https://www.spoj.com/problems/COT/en/ 思路: 首先看到求两点之前的第k小很容易想到用主席树去写,但是主席树处理的是线性结构,而这道题要求的是树形结构,我们 ...
- [luogu3834]静态区间第k小【主席树】
传送门:https://www.luogu.org/problemnew/show/P3834 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 分析 很多人都说是用 ...
随机推荐
- WIN7使用msg命令发送消息心得
昨天搞了一下午+一晚上,终于捣鼓出了一些奇奇怪怪的操作,成功发送了消息. 应实验要求,博主有幸在家里搞到了两台win7,其他的系统是不是这么操作就不太清楚了. 一开始实验指导书上是用net send发 ...
- Codeforces Round #642 (Div. 3)
比赛链接:https://codeforces.com/contest/1353 A - Most Unstable Array 题意 构造大小为 $n$,和为 $m$ 的非负数组 $a$,使得相邻元 ...
- bzoj3626: [LNOI2014]LCA (树链剖分+离线线段树)
Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先. ...
- Codeforces Round #649 (Div. 2) C、Ehab and Prefix MEXs D、Ehab's Last Corollary 找环和点染色
题目链接:C.Ehab and Prefix MEXs 题意; 有长度为n的数组a(下标从1开始),要求构造一个相同长度的数组b,使得b1,b2,....bi集合中没有出现过的最小的数是ai. mex ...
- Codeforces Round #602 Div2 D1. Optimal Subsequences (Easy Version)
题意:给你一个数组a,询问m次,每次返回长度为k的和最大的子序列(要求字典序最小)的pos位置上的数字. 题解:和最大的子序列很简单,排个序就行,但是题目要求字典序最小,那我们在刚开始的时候先记录每个 ...
- hdu3480 Division
Problem Description Little D is really interested in the theorem of sets recently. There's a problem ...
- Codeforces Round #650 (Div. 3) D. Task On The Board (构造,贪心)
题意:有一个字符串和一组数,可以对字符串删去任意字符后为数组的长度,且可以随意排序,要求修改后的字符串的每个位置上的字符满足:其余大于它的字符的位置减去当前位置绝对值之和等于对应序列位置上的数. 题解 ...
- Hyper-V安装CentOS修改分辨率
grubby --update-kernel=ALL --args="video=hyperv_fb:1600x900" reboot https://blog.csdn.net/ ...
- CF1465-D. Grime Zoo
CF1465-D. Grime Zoo 题意: 一个长度为n,由\(0,1,?\)这三个字符构成的字符串,字符串中\(01\)子串贡献\(x\)值,\(10\)的子串贡献\(y\)值,现在让你把\(? ...
- CF1466-D. 13th Labour of Heracles
CF1466-D. 13th Labour of Heracles 题意: 给出一个由\(n\)个点构成的树,每个点都有一个权值.现在你可以用\(k,k\subset\)\([1, n]\)个颜色来给 ...