日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算字典的个数_[LeetCode] 440. 字典序的第K小数字

發(fā)布時(shí)間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算字典的个数_[LeetCode] 440. 字典序的第K小数字 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接: 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。