給定乙個整數 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 即為死細胞。每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 根據當前狀態,寫乙個函式來計算面板上細胞的下乙個 一次更新後的 狀態。下乙...