字典序的第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;
}
}