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; } };
|