序號 | 文獻 |
---|---|
1 | leetcode 96. Unique Binary Search Trees |
2 | [LeetCode] 96. Unique Binary Search Trees 獨一無二的二叉搜索樹 |
Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n?html
Example:python
Input: 3 Output: 5 Explanation: Given n = 3, there are a total of 5 unique BST's: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
這道題求解的是指定1-n個數字,能夠求出多少中不一樣的二叉搜索樹(左子樹必須小於根節點,右子樹大於根節點)。本題能夠採用動態規劃的方式求解:code
咱們設G(n) 是n個數字能夠構造的樹的總數。則這個總數必然是 從1-n個數字輪流當根節點的總和。那麼一個數字當根節點的時候,必然[1-i-1] 是小於i的,[i+1 - n ]是大於i的。那麼當i爲節點的時候,它能構造的總的二叉樹的數量就是[1-i-1] 能構造的左子樹數和[ i+1 - n ]能構造的右子樹的數的和。咱們設F(i,n) 是i能構建的樹的總和。所以有:htm
G(n) = F(1,n)+F(2,n) +F(3,n) ….. F(n,n)blog
那麼F(i,n)怎麼轉換呢?根據上面的描述F(i,n)能構造的總的二叉樹的數量就是[1-i-1] 能構造的左子樹數和[ i+1 - n ]能構造的右子樹的數的和。咱們設F(i,n) 是i能構建的樹的總和。所以F(i,n) = G(i-1)G(n-i)。所以G(n)能夠轉換爲:leetcode
G(n) = G(0)G(n-1)+G(1)G(n-2)+...+G(n-1)*G(0)get
到這裏思路就很清晰了,接下來看下實現io
class Solution(object): def numTrees(self, n): """ :type n: int :rtype: int """ l = n + 1 dp = [0] * l dp[0] = 1 dp[1] = 1 for i in range(2,l): for j in range(1,i+1): dp[i] += dp[j-1] * dp[i-j] return dp[l-1]