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_6045】开餐馆(DP)

    题意:有N个地址,从中选一些开餐馆,要保证相邻餐馆的距离大于k.问最大利润. 解法:f[i]表示在前 i 个地址中选的最大利润. 1 #include<cstdio> 2 #include ...

  2. L3-002 特殊堆栈 (30分) vector容器的模拟、vector容器的一些用法

    vector容器的简单应用,我们可以用vector维护一个有序数组,每次对要插入的数用upper_bound或者lower_bound来 为这个数找一个应该插入到vector的位置.另外再找一个数组来 ...

  3. 前端模块化之ES Module

    一.概述 之前提到的几种模块化规范:CommonJS.AMD.CMD都是社区提出的.ES 2015在语言层面上实现了模块功能,且实现简单,可以替代CommonJS和AMD规范,成为在服务器和浏览器通用 ...

  4. CF1465-C. Peaceful Rooks

    CF1465-C. Peaceful Rooks 预备小知识: Rook(国际象棋中的车). 国际象棋中的棋子.每人有2个,他只能直走,不能斜走,除王车易位外不能越子. -- 来自<百度百科&g ...

  5. ssh配置方面小实验①

    注意:sshd_config配置文件有些特殊:注释掉的选项,并不是不生效的,而是默认生效选项.使用某选项时,要先取消注释,再修改为yes或no关于效率和安全的说明:安全:telnet < ssh ...

  6. Bootstrap微章

    给链接.导航等元素嵌套 span class="badge" 元素,可以很醒目的展示新的或未读的信息条目. <a href="#">Inbox &l ...

  7. 重学c#————struct

    前言 简单整理一下struct. 正文 struct 对于struct 而言呢,我们往往会拿class作为对比,但是呢,我们在初学阶段用class来替代struct,struct的存在感越来越低了. ...

  8. 图解 git stash

    图解 git stash # 暂存本地 变化 $ git stash # 复原 $ git stash pop The "git stash" command can help y ...

  9. CSS 定位 relative && absolute 问题?

    1 1 1 CSS 定位 relative && absolute 问题? 谁能解释一下,为什么div使用 relative是设置right,bottom 后,看不到div 呀,哪里多 ...

  10. 微软收购 GitHub

    微软收购 GitHub 微软收购 GitHub震惊业界:引发开发者信任问题 https://news.cnblogs.com/n/598432/ GitLab refs xgqfrms 2012-20 ...