zoukankan      html  css  js  c++  java
  • leetcode 字典序第K小数字

    给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。

    注意:1 ≤ k ≤ n ≤ 109。

    示例 :

    输入:
    n: 13 k: 2

    输出:
    10

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

    题解:

    题目求字典序最小的第k个数,我们可以考虑字典树,假设我们有一颗字典树(10叉树),那么我们可以判断相邻两个前缀之间相差的数量,如果大于K,那么答案就是以小的前缀开头的进入下一层继续判断。如果小于等于K那么继续往后判断下一个前缀。最终找到答案。

    参考代码:

     1 class Solution {
     2 public:
     3     int fun(long long n,long long cur,long long res)
     4     {
     5         long long steps=0;
     6         while(cur<=n)
     7         {
     8             steps+=min(n+1,res)-cur;
     9             cur*=10; res*=10;
    10         }
    11         return steps;
    12     }
    13 
    14     int findKthNumber(int n, int k) 
    15     {
    16         int ans=1; --k;
    17         while(k>0)
    18         {
    19             int steps=fun(n,ans,ans+1);
    20             if(steps>k) --k,ans=ans*10;
    21             else k-=steps,ans++;
    22         }
    23         return ans;
    24     }
    25 };
    C++
  • 相关阅读:
    Tips
    react
    Vue 双向绑定
    jQuery 学习笔记
    CC NOV17
    一种高效处理无修改区间或树上询问的数据结构(附代码)
    HNOI 2017
    PA2015
    bzoj 泛做
    GG
  • 原文地址:https://www.cnblogs.com/csushl/p/12363915.html
Copyright © 2011-2022 走看看