研究生開學以來一直在看書看文獻,不多有機會去寫代碼。爲了避免讓之後校招時被虐的太慘,準備天天看一道LeetCode上的題,練練手。 所以準備開一個新的專題,記錄下LeetCode上的一些有意思的小的算法題。 不要問我什麼是LeetCode,自行google噢。
題目傳送門在此
題目
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For example, Given n = 3, there are a total of 5 unique BST's.
分析
又是一道關於BSTree的題目,不過沒有涉及到其餘高深的特性。咱們只須要了解什麼是BST就行。 BST中文名是二叉搜索樹,節點左子樹的值都要小,右子樹的值都要大。以爲我說的比較繞口,移步至
BST Wiki 對於這道題,咱們能夠用遞歸,或者說成動態規劃,的思路去解決。 譬如說對於參數值n,咱們能夠考慮左邊1個節點,右邊n-2個節點;左邊2個節點,右邊n-3個節點等等。對於每一個子樹,在進行這樣的劃分,這樣就能看到動態規劃的影子了。 咱們須要一個List來保存結果,下標是其總節點數,數值是其組成BST的個數。show 代碼就好理解了。
def numTrees(n):
results = [1, 1] + [0 for i in range(n)] #0和1 都只有一種狀況
for i in range(2, n+1):
for j in range(i):
results[i] += results[j] * results[i-j-1]
return results[n]
# test
if __name__ == "__main__":
print numTrees(4)
--EOF--