LeetCode Unique Binary Search Trees
2016-01-31 16:15
513 查看
LeetCode解题之Unique Binary Search Trees
原题
给定1到n这n个数,用它们能够构成多少种形状不同的二叉搜索树。注意点:
这n个数都要是二叉搜索树的节点,不能只取部分
例子:
输入: n = 3
输出: 5
[code] 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
解题思路
首先明确n个不等的数它们能构成的二叉搜索树的种类都是相等的。而且1到n都可以作为二叉搜索树的根节点,当k是根节点时,它的左边有k-1个不等的数,它的右边有n-k个不等的数。以k为根节点的二叉搜索树的种类就是左右可能的种类的乘积。用递推式表示就是h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2),其中h(0)=h(1)=1,因为0个或者1个数能组成的形状都只有一个。从1到n依次算出h(x)的值即可。此外这其实就是一个卡特兰数,可以直接用数学公式计算,不过上面的方法更加直观一些。
AC源码
[code]class Solution(object): def numTrees(self, n): """ :type n: int :rtype: int """ dp = [1 for __ in range(n + 1)] for i in range(2, n + 1): s = 0 for j in range(i): s += dp[j] * dp[i - 1 - j] dp[i] = s return dp[-1] if __name__ == "__main__": assert Solution().numTrees(5) == 42
欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。
相关文章推荐
- android-Building a Notification,Preserving Navigation when Starting an Activity
- Codeforces 67C Sequence of Balls 编辑距离 dp
- BZOJ-1206 虚拟内存 Hash+离散化+Priority_Queue
- BZOJ-1206 虚拟内存 Hash+离散化+Priority_Queue
- iOS UITextField
- iOS8下的UIAlertContoller初探
- UE-9260使用说明1
- 联合国大楼UVA1605(Building for UN)
- Vawio Sequence (NYOJ 763 LIS变形)
- Build.gradle配置
- 通过StoryBoard创建UIViewController
- 技术杂记-改造具有监控功能的数据库连接池阿里Druid,支持simple-jndi,kettle
- 304. Range Sum Query 2D - Immutable
- QA:UICollectionView不能选中问题
- 处理键盘升起后对界面覆盖问题的处理
- 通过value取得Map中的Key的方法
- Arduino接口-week3-Lesson3
- [转]iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法
- POJ 2031:Building a Space Station【Prim】
- Arduino接口-week3-Lesson2