【回溯-数字全排列&&dfs】leet 440. 字典序的第K小数字

给定整数 n 和 k,返回  [1, n] 中字典序第 k 小的数字。

示例 1:

输入: n = 13, k = 2
输出: 10
解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。

示例 2:

输入: n = 1, k = 1
输出: 1

提示:

  • 1 <= k <= n <= 109

  class Solution {
    public int findKthNumber(int n, int k) {
        int r = 1; //当k=1的时候,答案就是 r
        while (k > 1) { //所以k从>1开始
            long t = count(r, n); 
            if (t < k) {
                k -= t; r++;
            } else {
                k--; r *= 10;
            }
        }
        return r;

    }

    public long count(long r,int n){ //在以r为节点的树上找<=n的节点的数量
        long next=r+1;
        long total=0;
        while(r<=n){
            total+=Math.min(n+1,next)-r; //r层节点个数. 含有n 或 next-1,不含有next
            r=r*10;
            next=next*10;
        }
        return total;
    }
}

算法笔试题解-回溯系列 文章被收录于专栏

算法笔试题解-回溯系列

全部评论

相关推荐

苗条的伊泽瑞尔最喜欢...:同28届被压力了,电科✌就不能去卷算法吗?把Java留给我们双非卷
投递快手等公司10个岗位
点赞 评论 收藏
分享
在写周报的打工人很独...:这个笔试昨天晚上做了一下,真难啊,前后端,ai全有
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务