天天看點

python字典添加數組_每日算法系列【LeetCode 386】字典序排數

python字典添加數組_每日算法系列【LeetCode 386】字典序排數

題目描述

給定一個整數 n, 傳回從 1 到 n 的字典順序。

例如,給定 n = 13,傳回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。

請盡可能的優化算法的時間複雜度和空間複雜度。 輸入的資料 n 小于等于 5,000,000。

題解

排序法

首先把 1 到 n 所有整數的字元串形式放進數組,然後對這個字元串數組進行排序,最後把所有字元串轉換成對應的整數就行了。

時間複雜度是

python字典添加數組_每日算法系列【LeetCode 386】字典序排數

,空間複雜度是

python字典添加數組_每日算法系列【LeetCode 386】字典序排數

字典樹法

還可以按從小到大順序直接生成所有整數,首先觀察如下的字典樹:

python字典添加數組_每日算法系列【LeetCode 386】字典序排數

字典樹

可以看出來,這是一棵 10 叉的字典樹,第一層根節點,第二層沒有 0 (因為不能有前導 0 ),後面的每一層都是在上一層的基礎上添加一位 0 到 9 。

而如果按照前序周遊的順序周遊這棵樹,得到的整數序列就是字典序從小到大的。但是這棵樹深度是沒有限制的啊,是以如果周遊到的數字 x 大于 n 的話,就要結束周遊,回溯到上一層。

時間複雜度是

python字典添加數組_每日算法系列【LeetCode 386】字典序排數

,空間複雜度是

python字典添加數組_每日算法系列【LeetCode 386】字典序排數

代碼

排序法(c++)

class 
           

排序法(python)

class 
           

字典樹法(c++)

class 
           

字典樹法(python)

class 
           

後記

字典序法的遞歸需要耗費更大的空間,而在實際運作中, python 代碼排序法的運作速度甚至比字典序法更快,這說明了 python 遞歸是真的慢。