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. zjnu1707 TOPOVI (map+模拟)

    Description Mirko is a huge fan of chess and programming, but typical chess soon became boring for h ...

  2. 【noi 2.6_2988】计算字符串距离(DP)

    题意: 给两个字符串,可以增.删.改,问使这两个串变为相同的最小操作数. 解法:(下面2种的代码主要区别在初始化和,而状态转移方程大家可挑自己更容易理解的方法打) 1.f[i][j]表示a串前i个和b ...

  3. HDU 3488-Tour KM

    为什么可以这样拆点在 这道题 都已经证明过 代码: 1 //题目上面说了"The only exception is that the first and the last city sho ...

  4. JavaScript——DOMM

    文本节点 != 文本内容

  5. 踏上Revit二次开发之路 0 序

    0 序 近来,由于工作上的需要,开始自学Revit二次开发. Revit由欧特克公司专为BIM构建,是建筑业体系中使用最广泛的软件之一.借助欧特克公司在我国市场占有率方面的绝对优势,甚至给不少人带来& ...

  6. kubernetes实战-配置中心(三)配置服务使用apollo配置中心

    使用配置中心,需要开发对代码进行调整,将一些配置,通过变量的形式配置到apollo中,服务通过配置中心来获取具体的配置 在配置中心修改新增如下配置: 项目信息: 配置: 重新打包镜像,使用apollo ...

  7. JavaScript预编译过程理解

    1-JavaScript运行三部曲 语法分析 预编译 解释执行 语法分析很简单,就是引擎检查你的代码有没有什么低级的语法错误: 解释执行顾名思义便是执行代码了: 预编译简单理解就是在内存中开辟一些空间 ...

  8. hdu2333-贪心,如何去后效性,背包太大怎么办,如何最大化最小值,从无序序列中发掘有序性质

    补充一下我理解的中文题意.. 你要重新组装电脑..电脑有一些部件..你的预算有b,b(1~1e9),有n个部件..每个部件有类型和名称以及价钱和质量现在你要在不超过预算b的情况下..每个类型都买一个部 ...

  9. JPG学习笔记2(附完整代码)

    #topics h2 { background: rgba(43, 102, 149, 1); border-radius: 6px; box-shadow: 0 0 1px rgba(95, 90, ...

  10. Flutter & Scaffold & multiple floatingActionButton

    Flutter & Scaffold & multiple floatingActionButton demo import 'package:flutter/material.dar ...