leetcode 440 字典序的第K小數字

2021-10-09 17:44:49 字數 1238 閱讀 4767

目錄

一、題目內容

二、解題思路

三、**

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

十叉樹,那麼,滿十叉樹包括根節點和10個子節點一共11個節點,因此進入子樹的方法是根節點*10然後依次加1,判斷k和當前子樹節點個數:

如果k大於子樹節點個數,則進入兄弟節點,也就是加1,並且k減當前子樹節點個數(滿的話減10);

如果k小於等於子樹節點個數,則*10進入子節點,並且k減1。

class solution:

def findkthnumber(self, n: int, k: int) -> int:

cur = 1

while k > 1:

left = cur

right = cur + 1

num = 0

# 統計這棵子樹下所有節點數(num)

while left <= n:

num += min(right, n + 1) - left

left *= 10

right *= 10

if num < k:#不在子樹中

cur += 1

k -= num

else:#在子樹中,進入子樹

cur *= 10

k -= 1

return cur

if __name__ == '__main__':

n = 13

k = 5

s = solution()

ans = s.findkthnumber(n, k)

print(ans)

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是字首...