给定整数 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 };