伴你如风、护你如影|

xzh-yyds

园龄:3年8个月粉丝:0关注:2

leetcode440-字典序的第K小数字

字典序的第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 中国大陆许可协议进行许可。

posted @   xzh-yyds  阅读(13)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开