计算字典的个数_[LeetCode] 440. 字典序的第K小数字
題目鏈接: https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order
難度:困難
通過率:28.4%
題目描述:
給定整數(shù) n 和 k,找到 1 到 n 中字典序第 k 小的數(shù)字。
注意:1 ≤ k ≤ n ≤ 109。
示例:
**輸入:** n: 13 k: 2**輸出:** 10**解釋:** 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的數(shù)字是 10。思路:
十叉樹,用題目的測試用例來舉例子。
我們求字典序第k個就是上圖前序遍歷訪問的第k節(jié)點!但是不需要用前序遍歷,如果我們能通過數(shù)學方法求出節(jié)點1和節(jié)點2之間需要走幾步,減少很多沒必要的移動。
其實只需要按層節(jié)點個數(shù)計算即可,圖中節(jié)點1和節(jié)點2在第二層,因為n = 13,節(jié)點1可以移動到節(jié)點2(同一層)所以在第二層需要移動1步。
第三層,移動個數(shù)就是 (13 - 10 + 1) = 4 (min(13 + 1, 20) - 10)
所以節(jié)點1到節(jié)點2需要移動 1 + 4 = 5 步
當移動步數(shù)小于等于k,說明需要向右節(jié)點移動,圖中就是節(jié)點1移動到節(jié)點2。
當移動步數(shù)大于k,說明目標值在節(jié)點1和節(jié)點2之間,我們要向下移動!即從節(jié)點1移動到節(jié)點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總結(jié)
以上是生活随笔為你收集整理的计算字典的个数_[LeetCode] 440. 字典序的第K小数字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux jdk安装(linux 下j
- 下一篇: data layui table 排序_