计算字典的个数_[LeetCode] 440. 字典序的第K小数字
生活随笔
收集整理的這篇文章主要介紹了
计算字典的个数_[LeetCode] 440. 字典序的第K小数字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接: https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order
難度:困難
通過率:28.4%
題目描述:
給定整數 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。思路:
十叉樹,用題目的測試用例來舉例子。
我們求字典序第k個就是上圖前序遍歷訪問的第k節點!但是不需要用前序遍歷,如果我們能通過數學方法求出節點1和節點2之間需要走幾步,減少很多沒必要的移動。
其實只需要按層節點個數計算即可,圖中節點1和節點2在第二層,因為n = 13,節點1可以移動到節點2(同一層)所以在第二層需要移動1步。
第三層,移動個數就是 (13 - 10 + 1) = 4 (min(13 + 1, 20) - 10)
所以節點1到節點2需要移動 1 + 4 = 5 步
當移動步數小于等于k,說明需要向右節點移動,圖中就是節點1移動到節點2。
當移動步數大于k,說明目標值在節點1和節點2之間,我們要向下移動!即從節點1移動到節點10。
代碼:
class Solution:def findKthNumber(self, n: int, k: int) -> int:def cal_steps(n, n1, n2):step = 0while n1 <= n:step += min(n2, n + 1) - n1n1 *= 10n2 *= 10return stepcur = 1k -= 1while k > 0:steps = cal_steps(n, cur, cur + 1)if steps <= k:k -= stepscur += 1else:k -= 1cur *= 10return cur總結
以上是生活随笔為你收集整理的计算字典的个数_[LeetCode] 440. 字典序的第K小数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux jdk安装(linux 下j
- 下一篇: data layui table 排序_