计算字典的个数_[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。思路:
十叉樹,用題目的測(cè)試用例來舉例子。
我們求字典序第k個(gè)就是上圖前序遍歷訪問的第k節(jié)點(diǎn)!但是不需要用前序遍歷,如果我們能通過數(shù)學(xué)方法求出節(jié)點(diǎn)1和節(jié)點(diǎn)2之間需要走幾步,減少很多沒必要的移動(dòng)。
其實(shí)只需要按層節(jié)點(diǎn)個(gè)數(shù)計(jì)算即可,圖中節(jié)點(diǎn)1和節(jié)點(diǎn)2在第二層,因?yàn)閚 = 13,節(jié)點(diǎn)1可以移動(dòng)到節(jié)點(diǎn)2(同一層)所以在第二層需要移動(dòng)1步。
第三層,移動(dòng)個(gè)數(shù)就是 (13 - 10 + 1) = 4 (min(13 + 1, 20) - 10)
所以節(jié)點(diǎn)1到節(jié)點(diǎn)2需要移動(dòng) 1 + 4 = 5 步
當(dāng)移動(dòng)步數(shù)小于等于k,說明需要向右節(jié)點(diǎn)移動(dòng),圖中就是節(jié)點(diǎn)1移動(dòng)到節(jié)點(diǎn)2。
當(dāng)移動(dòng)步數(shù)大于k,說明目標(biāo)值在節(jié)點(diǎn)1和節(jié)點(diǎn)2之間,我們要向下移動(dòng)!即從節(jié)點(diǎn)1移動(dòng)到節(jié)點(diǎn)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 排序_