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. 【noi 2.6_9272】偶数个数字3(DP)

    题意:问所有的N位数中,有多少个有偶数个数字3的数. 解法:f[i][j]表示i位数中含数字3的个数模2为j的个数.于是分第i位填3还是不填3讨论. 小tip:要模12345:for循环新定义了一个变 ...

  2. Leetcode】周赛203 查找大小为M的最新分组

    题意: 给你一个数组 arr ,该数组表示一个从 1 到 n 的数字排列.有一个长度为 n 的二进制字符串,该字符串上的所有位最初都设置为 0 . 在从 1 到 n 的每个步骤 i 中(假设二进制字符 ...

  3. Codeforces Round #651 (Div. 2) A. Maximum GCD (思维)

    题意:在\(1\)~\(n\)中找两个不相等的数使得他们的\(gcd\)最大. 题解:水题,如果\(n\)是偶数,那么一定取\(n\)和\(n/2\),\(n\)是奇数的话,取\(n-1\)和\((n ...

  4. Bing壁纸-20200417

  5. GO - 高级编程

    https://books.studygolang.com/gopl-zh/ https://chai2010.cn/advanced-go-programming-book/

  6. Gitlab 快速部署及日常维护 (一)

    一.GitLab简介GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务 二.GitLab系统架构git用户的主目录通常是/home/git(~ ...

  7. 解决关闭ssh后网页停止服务的方法,利用nohup

    上一篇文章提到宝塔面板无法运行,只能用ssh运行app.py. 关闭ssh时,app.py会被杀死.因为app.py的父进程就是ssh,关掉ssh会造成进程被杀死. 解决方法参考  https://w ...

  8. Leetcode(8)-字符串转整数

    实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值 ...

  9. 字节跳动-前端面试题 Multi Promise Order

    字节跳动-前端面试题 Multi Promise Order Promise Order Async/Await async function async1 () { console.log('asy ...

  10. 1GB === 1000MB & 1GB === 1024MB

    1GB === 1000MB & 1GB === 1024MB 字节单位换算 1 Gigabyte = 1000 Megabytes 1 Gibibyte = 1024 Mebibytes 十 ...