【LeetCode天天一題】 Unique Binary Search Trees(惟一二叉搜索樹)

Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n?數組

Example:spa

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

思路

  在思考這道題的時候,中途想着應該是使用動態規劃來解決問題。可是動態沒能想明白dp[n]與dp[n-1]之間的關係,最終也沒能寫出來。最後看了別人的思路以後明白了。
  這裏咱們使用
dp[k]表示從1到 k 數字創建的BST樹的數量。假設咱們如今已經計算出1到4能夠有多少棵二叉搜索樹,dp [1] = 1,dp [2] = 2,dp [3] = 5,dp [4] = 14,咱們如何獲得dp[5]?基本過程是:要構建一個樹,咱們須要選擇一個根節點,而後咱們須要知道在該節點下能夠保留多少個可能的左子樹和右子樹,最後將它們相乘。構建一個包含{1,2,3,4,5}的樹。首先咱們先選擇數字1做爲根節點,這樣左子樹爲空。對於右的子樹,咱們須要計算從{2,3,4,5}構造出多少可能的樹,顯然它與{1,2,3,4}的數字相同。所以,選擇數字1做爲根節點時,惟一二叉搜索樹的總數是dp [0] * dp [4] = 14(dp[0] = 1。dp[0]表明左邊不一樣的子樹樹量, dp[4]表明右邊不一樣的子樹結構數量).()。以此類推,根節點爲2時,dp [1] * dp [3] = 5,根節點爲3時,有dp [2] * dp [2] = 4,根節點爲4時,dp [3] * dp [1] = 5,根節點爲5時,dp [0] * dp [4] = 14。最後求和完成。
解決代碼

 
 1 class Solution(object):  2 def numTrees(self, n):  3 """  4  :type n: int  5  :rtype: int  6 """  7 dp = [0] *(n+1) # 構建輔助數組  8 dp [0] = dp[1] = 1 # 初始化  9 for i in range(2,n+1): # 兩層循環,第一層循環表示第幾個元素, 第二層循環表示求當前元素有多少不一樣的搜索樹。 10 for j in range(1, i+1): 11 dp[i] += dp[j-1]*dp[i-j] 13 return dp[n]
相關文章
相關標籤/搜索