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++

 

posted @ 2020-02-25 21:31  StarHai  阅读(744)  评论(0编辑  收藏  举报