徐州市做网站wordpress+编辑器回车
徐州市做网站,wordpress+编辑器回车,最好的免费推广平台,外链百科440. 字典序的第K小数字
给定整数 n 和 k#xff0c;找到 1 到 n 中字典序第 k 小的数字。
注意#xff1a;1 ≤ k ≤ n ≤ 109。
示例 :
输入: n: 13 k: 2
输出: 10
解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]#xff0c;所以第二小的数字是…440. 字典序的第K小数字
给定整数 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。
解题思路
N个数字可以组织成为具有n个节点的10叉树该树的前序遍历就是数字的字典序如图所示 我们的目标就是需要找前序遍历的第k个节点
我们可以选择性的选择父节点遍历不需要遍历前k个节点。
例如
输入:
n: 13 k: 6输出:
2解释:
字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]所以第六小的数字是 2。我们可以通过计算出以1开头有多少个节点对比和k的关系。
以1为根节点的子树节点数量为5如果k为6说明不需要遍历以1为根节点的树直接向左移动到以2为根节点的树上继续遍历以1为根节点的子树节点数量为5如果k为2说明我们需要遍历的节点必然在根节点1的子树上面我们移动到根节点的最左子节点继续遍历
如何计算子树的节点树 从上图可以观察出每一层节点的数字都是单调递增的例如1011…19,20,因此我们通过计算根节点的最左节点来固定每一层的节点数
每一层我们需要计算的节点数位于上图红线划分的区间中。
代码
class Solution {public int findKthNumber(int n, int k) {long cur1;k--;while (k0){int number findingKthNumber(n, cur);if (knumber){k-number;cur;}else {k--;cur*10;}}return (int)cur;}//sum 上一层的数字public int findingKthNumber(int n, long cur) {long nextcur1;long res0;while (curn){res Math.min(n-cur1,next-cur);cur*10;next*10;}return (int)res;}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87786.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!