《算法分析与设计》Week 8
来源:互联网 发布:mac版本更新 编辑:程序博客网 时间:2024/05/08 09:15
96. Unique Binary Search Trees
Description:
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?
For example,
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
Solution:
一、题意理解
给定一个数n,有多少个异构的二叉搜索树用来存储1...n?所谓异构,类似化学中的同素异构体,就是组成元素相同,但是在空间结构上的组成方式不同。
二、分析
1、可以用动态规划来解,找到状态转移方程。要寻找节点数为n的二叉搜索树的异构体数量,可以依次寻找限制以i(i=1,2,...,n)为根节点的二叉搜索树的异构体,然后将其累加即可。不妨设:
G(n):存储序列1...n的二叉搜索树的异构体数目,也是我们要求解的目标。
F(i, n):存储序列1...n时,限制以i为根节点的二叉搜索树的异构体数目。
2、而动态规划,无非就是用已经求解的值来得到另一个条件下的值。有了以上的假设,很容易得到如下的式子:
G(n) = F(1, n) + F(2, n) + F(3, n) + ... + F(n, n)
F(i, n) = G(i - 1) * G(n - i)
第一个式子很好理解,就是一个累加。对于第二个式子来说,比如n = 6,当限制以3为根节点时,{1,2}组成根节点3的左子树,{4,5,6}组成根节点3的右子树,而左子树{1,2}的异构体数目自然等于G(3-1) = G(2),右子树{4,5,6}的异构体数目和{1,2,3}的异构体数目相同,为G(6-3) = G(3)。所以F(3, 6) = G(2) * G(3)。
3、结合上述两个式子,就可以得到最终的状态转移方程:
G(n) = G(0) * G(n-1) + G(1) * G(n-2) + G(2) * G(n-3) + ... + G(n-1) * G(0)
4、代码如下:
class Solution {public: int numTrees(int n) { int *G = new int[n+2]; G[0] = G[1] = 1; for(int i=2; i<=n; ++i) { G[i] = 0; for(int j=1; j<=i; ++j) { G[i] += G[j-1] * G[i-j]; } } int tmp = G[n]; delete G; return tmp; }};
- 《算法分析与设计》Week 8
- 《算法分析与设计》Week 1
- 《算法分析与设计》Week 2
- 《算法分析与设计》Week 3
- 《算法分析与设计》Week 6
- 《算法分析与设计》Week 7
- 《算法分析与设计》Week 9
- 《算法分析与设计》Week 10
- 《算法分析与设计》Week 11
- 《算法分析与设计》Week 12
- 《算法分析与设计》Week 13
- 《算法分析与设计》Week 14
- 《算法分析与设计》Week 15
- 《算法分析与设计》Week 16
- 《算法分析与设计》Week 17
- 《算法分析与设计》Week 18
- 《算法分析与设计》Week 19
- 算法设计与分析 - Week 3 分治策略
- startPreview()调用细节分析三
- 系统运营要点
- 1060. 爱丁顿数(25)
- nginx负载服务器
- 海量数据相似查找系列2 -- Annoy算法
- 《算法分析与设计》Week 8
- 浅谈jQuery源码(七)——$.makeArray
- 关闭STA自动调优
- imx6q ARM cotex-A9 参考手册
- IMWeb训练营作业-完成Todolist小demo
- Apache负载服务器
- PhantomJS用法示例
- 深度学习新书Deep learning with python 2017
- hibernate教程--事务处理详解