目錄
一、題目內容
二、解題思路
三、**
給定整數 n 和 k,找到 1 到 n 中字典序第 k 小的數字。注意:1 ≤ k ≤ n ≤ 109。
示例 :十叉樹,那麼,滿十叉樹包括根節點和10個子節點一共11個節點,因此進入子樹的方法是根節點*10然後依次加1,判斷k和當前子樹節點個數:輸入:
n: 13 k: 2
輸出:
10
解釋:
字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的數字是 10。
如果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是字首...