leetcode-440:字典序的第K小数字

简介: leetcode-440:字典序的第K小数字

题目

题目链接

给定整数 n 和 k,返回 [1, n] 中字典序第 k 小的数字。

示例 1:

输入: n = 13, k = 2
输出: 10
解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。

示例 2:

输入: n = 1, k = 1
输出: 1

解题

  1. 确定指定前缀下所有子节点数 getCount
  2. 第k个数在不在当前前缀下
    2.1不在当前前缀下
    2.1在当前前缀下

方法一:字典树思想

参考链接

思路:(例:比如要查找第5个数,n=199)

1.找到当前前缀的下的数目 (例: 前缀为1 ,是第一个数 )

2.如果是在当前前缀下的,那么就缩小搜索范围(例:10,是第二个数),否则就换下一个前缀(例:2)

3. (例:100,是第三个数)

4. (例: 以100为前缀,没有这个数,因此cnt+=temp,得到102)

class Solution {
public:
    int findKthNumber(int n, int k) {
        int cnt=0; // 已经经过的元素个数, 开始一个元素都没有经过, 所以个数为 0
        int num=1; // 第一个元素 (经过 i 个元素, 当前 num 是第 i + 1 元素)
        while (true) {
            if (cnt == k - 1) {           // 经过了 k - 1 个元素找到了第 k 个元素 
                break;
            }
            int temp = getCount((long) num, n);     // 以 num 为根, 以 n 为最大值的十叉树的元素总个数
            if (cnt + temp >= k) {                  // 以 num 为根的十叉树内有第 k 个元素
                num *= 10;
                cnt++;
            } else if (cnt + temp < k) {            // 以 num 为根的十叉树内没有第 k 个元素
                num++;
                cnt += temp;
            }
        }
        return num;
    }
    int getCount(long num,int n){
        int cnt=0;// 元素总个数
        int width=1; // 当前层数的宽度, 第一层只有 num 一个元素, 所以第一层宽度为 1
        while(true){
            if(num+width-1<=n){ // n 的值大于等于当前层的最大值, 说明当前层数的个数可以全部添加
                cnt+=width;
                num*=10;
                width*=10;
            }
            else{// n 的值小于当前层的最大值则只能添加部分个数或者不添加, 并跳出循环
                if(n-num>=0){
                    cnt+=n-num+1;
                }
                break;
            }
        }
        return cnt;
    }
};


相关文章
|
21天前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
19天前
|
存储
力扣-2904最短且字典序最小的美丽子序列
力扣-2904最短且字典序最小的美丽子序列
14 1
|
21天前
|
存储 机器学习/深度学习 算法
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
LeetCode-440 字典序的第K小数字
LeetCode-440 字典序的第K小数字
|
2月前
|
Go
golang力扣leetcode 386.字典序排数
golang力扣leetcode 386.字典序排数
22 0
|
2月前
|
Go
golang力扣leetcode 440.字典序的第K小数字
golang力扣leetcode 440.字典序的第K小数字
24 0
|
2月前
|
Java
2697. 字典序最小回文串 --力扣 --JAVA
给你一个由 小写英文字母 组成的字符串 s ,你可以对其执行一些操作。在一步操作中,你可以用其他小写英文字母 替换  s 中的一个字符。 请你执行 尽可能少的操作 ,使 s 变成一个 回文串 。如果执行 最少 操作次数的方案不止一种,则只需选取 字典序最小 的方案。 对于两个长度相同的字符串 a 和 b ,在 a 和 b 出现不同的第一个位置,如果该位置上 a 中对应字母比 b 中对应字母在字母表中出现顺序更早,则认为 a 的字典序比 b 的字典序要小。 返回最终的回文字符串。
28 0
2697. 字典序最小回文串 --力扣 --JAVA
|
算法 C++ Python
每日算法系列【LeetCode 386】字典序排数
每日算法系列【LeetCode 386】字典序排数
|
算法
LeetCode——386. 字典序排数
LeetCode——386. 字典序排数
60 0
|
算法
LeetCode每日一题(3)——字典序排数
LeetCode每日一题(3)字典序排数 1.题目 2.示例 3.思路 4.代码