440. 字典序的第K小数字
思路
- 画出字典树

 
- k表示要找到后面的第k个元素,起始下标是0
 
- 获取以prefix开头的数字个数,包括他本身
- 如果数字个数大于k,下移,在prefix*10下的子树进行查找
 
- 如果数字个数小于等于k,右移,在prefix+1下的子树进行查找
 
 
问题的关键是求解 以prefix开头的数字个数,包括他本身
- 根节点 
[prefix, prefix+1 ) 
- 第一层 
[prefix*10, (prefix+1)*10 ) 
- 第二层 
[prefix*100, min(n+1, (prefix+1)*100) ) 
- …
 
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | class Solution { public: typedef long long LL;     int findKthNumber(int n, int k) {         int prefix = 1;                  k--;          while (k>0){             int cnt = getCnt(n, prefix);              if (cnt <= k) {                  k -= cnt;                 prefix++;             } else {                  k--;                  prefix*=10;             }         }         return prefix;     }     int getCnt(LL n, LL prefix){         LL cnt = 0;         for (LL first = prefix, second = prefix+1; first<=n; first*=10, second*=10){             cnt+= min(n + 1, second) - first;         }         return cnt;     } };
  |