leetcode 440 字典序的第K小數字

2021-10-08 16:33:10 字數 1411 閱讀 5301

給定整數 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。

看了題解做出來的。。感覺沒有想得很明白。

按照字典序排序,以數字i開頭的數字,一定在排在以數字i + 1開頭的數字之前,即:11***一定排在12x之前。

畫成1個十叉樹,差不多是這樣:

思路是,計算以prefix為字首的數字個數,記為n,如果k > n,則說明當前第k個數字在prefix的右邊,如果k <= n,則說明第k個數字在prefix為根節點的子樹上

class

solution

:def

get_count

(self, prefix:

int, n:

int)

->

int:

next_prefix = prefix +

1 count =

0while prefix <= n:

count +=

(min

(n +

1, next_prefix)

- prefix)

prefix *=

10 next_prefix *=

10return count

deffindkthnumber

(self, n:

int, k:

int)

->

int:

p =1 prefix =

1while p < k:

count = self.get_count(prefix, n)

if p + count > k:

prefix *=

10 p +=

1else

: prefix +=

1 p += count

return prefix

LeetCode440 字典序的第K小數字

有一說一,這題用樹的方式很容易理解,想象有如下一棵樹 我們要求第k小的樹,也就是求這樣乙個節點 以從上到下從左到右遍歷這棵樹它是第k個。因為如上所示的這棵樹它從上到下從左到右遍歷也就是字典序。所以我們可以按如下的步驟進行 從最頂上的節點出發,從左往右計算以每個子節點為字首的數字個數num numnu...

leetcode 440 字典序的第K小數字

目錄 一 題目內容 二 解題思路 三 給定整數 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。十叉樹,那麼,滿十叉...

440 字典序的第K小數字

題目鏈結 解題思路 一次計算以1,2,3,4,5,6,7,8,9,10,11,12.為字首的,不超過上界n的數字個數,對數字總數進行累加,累加的和為k時,將此時字首的下乙個數字prefix 1返回,即為字典序的第k小數字。c include using namespace std prefix是字首...