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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算字典的个数_[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小数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。