Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n?
Example:
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]