96. Unique Binary Search Trees

96. Unique Binary Search Trees

0. 參考文獻

序號 文獻
1 leetcode 96. Unique Binary Search Trees
2 [LeetCode] 96. Unique Binary Search Trees 獨一無二的二叉搜索樹

1. 題目

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

2.思路

這道題求解的是指定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

3. 實現

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]
相關文章
相關標籤/搜索