每日演算法系列 LeetCode 386 字典序排數

2021-10-02 09:35:25 字數 1639 閱讀 7204

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

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

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

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

時間複雜度是

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

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

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

時間複雜度是

class

solution

return

res;

}};

class

solution

:def

lexicalorder

(self,n

:int

)->

list

[int

]:res=

fori

inrange(1

,n+1

):res.(

str(i))

res.

sort

()res=[

int(x)

forx

inres

]return

res

class

solution

void

dfs(

intx

,intn,

vector

<

int>&

res)

}};

class

solution

:def

lexicalorder

(self,n

:int

)->

list

[int

]:res=

fori

inrange(1

,10):self

.dfs(i

,n,res

)return

resdef

dfs(

self,x

,n,res

):if

x>n:

return

res.(x

)foriin

range(10

):self

.dfs(x

*10+i

,n,res

)

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

每日演算法系列 7

建立三個指標,分別指著head前乙個結點pre,head,head後乙個結點next。初始化pre,使得pre先指著位於鍊錶頭部外部空間,設為null,next也設為null但並不存在指向者。首先先將next指向head.next,用於儲存head的下乙個結點,使得鍊錶轉向不會因為鍊錶斷裂而丟失he...

每日演算法系列 LeetCode 376 擺動序列

如果連續數字之間的差嚴格地在正數和負數之間交替,則數字序列稱為擺動序列。第乙個差 如果存在的話 可能是正數或負數。少於兩個元素的序列也是擺動序列。例如,1,7,4,9,2,5 是乙個擺動序列,因為差值 6,3,5,7,3 是正負交替出現的。相反,1,4,7,2,5 和 1,7,4,5,5 不是擺動序...

每日演算法系列 LeetCode 289 生命遊戲

給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞具有乙個初始狀態 live 1 即為活細胞,或 dead 0 即為死細胞。每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 根據當前狀態,寫乙個函式來計算面板上細胞的下乙個 一次更新後的 狀態。下乙...