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小数字 + 字典树 + 前缀 + 字典序的更多相关文章

  1. Java实现 LeetCode 440 字典序的第K小数字

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

  2. 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 ...

  3. [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 ...

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

    1. 题目 2. 解答 字典序排数可以看做是第一层节点分别为 1-9 的十叉树,然后我们在树上找到第 K 小的数字即可.因此,我们需要分别统计以 1-9 为根节点的每个树的节点个数.如果 K 小于当前 ...

  5. 字典序的第K小数字

    今天zyb参加一场面试,面试官听说zyb是ACMer之后立马抛出了一道算法题给zyb:有一个序列,是1到n的一种排列,排列的顺序是字典序小的在前,那么第k个数字是什么?例如n=15,k=7, 排列顺序 ...

  6. 9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第9章  查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚 ...

  7. bzoj 3065: 带插入区间K小值 替罪羊树 && AC300

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Des ...

  8. spoj COT - Count on a tree (树上第K小 LCA+主席树)

    链接: https://www.spoj.com/problems/COT/en/ 思路: 首先看到求两点之前的第k小很容易想到用主席树去写,但是主席树处理的是线性结构,而这道题要求的是树形结构,我们 ...

  9. [luogu3834]静态区间第k小【主席树】

    传送门:https://www.luogu.org/problemnew/show/P3834 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 分析 很多人都说是用 ...

随机推荐

  1. 【bzoj 3232】圈地游戏(算法效率--01分数规划+图论--最小割)

    题目:DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用.DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到回到出发点,且在行走 ...

  2. Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) B. Saving the City (贪心,模拟)

    题意:给你一个\(01\)串,需要将所有的\(1\)给炸掉,每次炸都可以将一整个\(1\)的联通块炸掉,每炸一次消耗\(a\),可以将\(0\)转化为\(1\),消耗\(b\),问将所有\(1\)都炸 ...

  3. windows server 2016 安装有线网卡驱动

    为自己的本本安装了server 2016系统,但是官网下载的有线网卡驱动一直安不上,解决方法如下: 1.到Intel官网下载一个叫PROWinx64的驱动程序,解压到任意文件夹.依次进入PRO1000 ...

  4. Chapter Zero 0.2.3 显示适配器

    显示适配器(Video Graphics Array,VGA) 不看后悔!!深入了解显卡!!!走你! 我们常常会调试显示器的分辨率,一般对于图像的显示重点在于分辨率与颜色深度, 每个图像显示的颜色会占 ...

  5. Python 3的f-Strings:增强的字符串格式语法(指南)

    最近也在一个视频网站的爬虫,项目已经完成,中间有不少需要总结的经验. 从Python 3.6开始,f-Strings是格式化字符串的一种很棒的新方法.与其他格式化方式相比,它们不仅更具可读性,更简洁且 ...

  6. centos7+腾讯云服务器搭建wordpress

    title: centos7+腾讯云服务器搭建wordpress date: 2020-03-04 categories: web tags: [wordpress] 分两部分:1.搭建LEMP环境 ...

  7. 2021-2-16:请问你知道分布式设计模式中的Quorum思想么?

    有效个数(Quorum) 有效个数(Quorum)这个设计模式一般是指分布式系统的每一次修改都要在大多数实例上通过来确定修改通过. 问题背景 在一个分布式存储系统中,用户请求会发到一个实例上.通常在一 ...

  8. how to auto open demo and create it in a new codesandbox

    how to auto open demo and create it in a new codesandbox markdown & iframe https://ant.design/do ...

  9. Emoji of github & twitter

    Emoji cheat sheet http://www.emoji-cheat-sheet.com/ https://github.com/xgqfrms/emoji-cheat-sheet.com ...

  10. CVS、SVN、Git、GitHub :版本控制系统

    1 1 1 Git常用命令 1 1 1 1 1 1 https://www.codecademy.com/learn/learn-git Learn Git You have now been int ...