【回溯-数字全排列&&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;
    }
}

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

算法笔试题解-回溯系列

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务