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]