字典序的第K小数字--java

给定整数 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。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public int findKthNumber(int n, int k) {
        long cur = 1;   //当前节点
        k -= 1;     //代表当前在1跟节点的树上,代表从1开始找到第k小的数字所需要的步数

        while(k > 0){
            int nodes = getNodes(n, cur);   //计算总结点树(包括父节点)
            if(k >= nodes){ //走到k所需要的步数大于此时节点的总结点数,说明要求的元素在右节点
                k -= nodes; //走到右节点所需要的步数
                cur++;      //向右走,得到右节点最大值
            }else{
                k -= 1;     //走到子节点所需要的步数
                cur *= 10;  //向下走,得到子节点第一个小的值
            }
        }

        return (int)cur;
    }

    private int getNodes(int n, long cur){
        long next = cur + 1;        //下一个节点
        long totalNodes = 0;        //总结点数
        
        while(cur <= n){
            totalNodes += Math.min(n + 1 - cur, next - cur);
            //n+1代表在当前节点下子节点的个数,next - cur代表求出某一节点中最大子节点的个数
            //第一轮算出父节点tot=1
            //第二轮算出父节点下子节点个数tot=4
            next *= 10; //更新以求出每个节点的最大总结点数量
            cur *= 10;
        }

        return (int)totalNodes;
    }
}
posted @ 2021-10-26 22:40  网抑云黑胶SVIP用户  阅读(37)  评论(0编辑  收藏  举报