leetcode440-字典序的第K小数字
- 字典树
对于给定的最大数n和剩余数字k,维护一个当前的字典树前缀cur,先让k减去最小的数字1,然后计算以cur为开头的字典树的容量。计算得出的字典树的容量大于k,说明k无法容纳整棵字典树,那么就仅仅取一个数(即cur10),更新cur = cur10,缩小字典树的范围,继续以cur为开头的字典树;如果字典树的容量小于等于cur,说明剩余的数字可以容纳以cur为开头的整棵字典树,那么更新剩余的数字k并更新cur = cur+1(当前前缀已经计算完成,需要计算更大的前缀内容)。
计算以cur为开头并小于等于最大数字n的字典树容量的思路如下:维护一个最小范围first和最大范围last,这两个数字的初始值都是等于cur。进行一个循环,直到first的数量大于n跳出,循环内先将first添加Math.min(n, last)
和first的差值,然后将first取最小值(first = first*10), last取最大值(last = last*10+9)。
class Solution {
public int findKthNumber(int n, int k) {
int cur = 1;
k--;
while(k > 0){
int steps = getState(cur, n);
if(steps <= k){
k -= steps;
cur++;
}else{
cur *= 10;
k--;
}
}
return cur;
}
public int getState(int cur, long n){
int cnt = 0;
long first = cur, last = cur;
while(first <= n){
cnt += Math.min(n, last)-first+1;
first *= 10;
last = last*10+9;
}
return cnt;
}
}
本文作者:xzh-yyds
本文链接:https://www.cnblogs.com/xzh-yyds/p/16627648.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步