【字典序第k小】

沙汀鱼發表於2024-09-05

440. 字典序的第K小數字

在0~9的字典樹(十叉樹)上,首先計算以 cur 為字首的小於等於n的節點個數有多少,即透過以 cur 為根找子樹中小於等於 n 的節點個數

如果子樹個數小於k,那麼就在同一層向右平移1,
否則就跳到cur的一下層第一個子節點

點選檢視程式碼
class Solution {
    public int findKthNumber(int n, int k) {
        int cur = 1;
        -- k;
        while(k > 0) {
            int num = find(cur, n);
            if(num <= k) {
                k -= num;
                ++ cur;
            } else {
                cur *= 10;
                -- k;
            }
        }
        return cur;
    }

    public int find(int cur, int n) {
        int num = 0;
        long l = cur;
        long r = cur;
        while(l <= n) {
            num += Math.min(r, n) - l + 1;
            l = l * 10;
            r = r * 10 + 9;
        }
        return num;
    }
}

相關文章