字典序第k小数字

 

 

 

 

https://leetcode.cn/problems/k-th-smallest-in-lexicographical-order/solution/pythonjavajavascriptgo-di-gui-by-himymbe-5mq5/

 

func findKthNumber(n int, k int) int {
    cur := 1
    k--
    for k > 0 {
        cnts := dfs(cur, cur,n)
        fmt.Println(cnts)
        if cnts <= k { //当前层cur,第cnts小的数比第k小还小,那么当前层的所有cnts个数都可以取,递归到下一层去找
            k -= cnts
            cur++
        } else {// 答案在当前节点的子节点中,则从当前cur层的最小子节点开始找,cur=cur*10
            k--
            cur *= 10
        }
    }
    return cur
}

func dfs (l, r,n int) int{//l,r分别是最小和最大子节点,返回值是递归开始层~当前层所有的子节点数
    //两个递归终止条件
    if l > n {
        return 0
    }
    if r > n {
        r = n
    }

    //当前层有 r - l + 1 个节点可取,递归到下一层。
    // l * 10: 从10变成100, r * 10 + 9: 从19变成199
    return r - l + 1 + dfs(l * 10, r * 10 + 9,n)
}

 

 
posted @ 2022-08-18 18:36  知道了呀~  阅读(93)  评论(0编辑  收藏  举报