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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章