[leetcode] 96.Unique Binary Search Trees
2015-06-26 17:04
351 查看
题目:
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
题意:
给一个数字n,使用[1,2…n]的数字构造二叉搜索树,一共可以构造出多少种。以上例子是当n=3
时,一共有五种可能。
思路:
分析题目的意思在[1,2…n]的数列中,可以随机挑一个作为树的跟,那么会有n种树的跟的情况。如果挑的数字是k,那么以k作为根的树的左子树上的节点应该是包含[1,..k-1],右子树上的节点是[k+1,..n]。如果是在序列[i…j]中,可以作为根节点的一共有j - i 种可能,每一种可能将序列截成两段,左边与右边各一段,选取k作为根节点,如果右边一段有m种构造树的可能,右边有n种构造树的可能,那么选取k作为根节点会产生树的可能是m*n。如果k==i或者k==j,则对应是n,m种可能。
可以找出状态转移方程:
DP[i][j] += DP[i][k-1]*DP[k+1][j] (k=i+1,…j-1)
DP[i][j] += DP[i+1]j
DP[i][j] += DP[i]j-1
可以发现,对于所要求的DP[i][j],依赖于DP[i][i]到DP[i][j-1],以及DP[i][j]到DP[j][j]。即如下图所示:
蓝色的区域DP[0][2]是需要计算的,那么它的计算就需要依赖于已经计算出来的橙色区域中的DP[0][0],DP[0][1],DP[1][2],DP[2][2],即该元素所在行的左边的元素,以及该元素所在行列的下方元素。
以上。
代码如下:
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
题意:
给一个数字n,使用[1,2…n]的数字构造二叉搜索树,一共可以构造出多少种。以上例子是当n=3
时,一共有五种可能。
思路:
分析题目的意思在[1,2…n]的数列中,可以随机挑一个作为树的跟,那么会有n种树的跟的情况。如果挑的数字是k,那么以k作为根的树的左子树上的节点应该是包含[1,..k-1],右子树上的节点是[k+1,..n]。如果是在序列[i…j]中,可以作为根节点的一共有j - i 种可能,每一种可能将序列截成两段,左边与右边各一段,选取k作为根节点,如果右边一段有m种构造树的可能,右边有n种构造树的可能,那么选取k作为根节点会产生树的可能是m*n。如果k==i或者k==j,则对应是n,m种可能。
可以找出状态转移方程:
DP[i][j] += DP[i][k-1]*DP[k+1][j] (k=i+1,…j-1)
DP[i][j] += DP[i+1]j
DP[i][j] += DP[i]j-1
可以发现,对于所要求的DP[i][j],依赖于DP[i][i]到DP[i][j-1],以及DP[i][j]到DP[j][j]。即如下图所示:
蓝色的区域DP[0][2]是需要计算的,那么它的计算就需要依赖于已经计算出来的橙色区域中的DP[0][0],DP[0][1],DP[1][2],DP[2][2],即该元素所在行的左边的元素,以及该元素所在行列的下方元素。
以上。
代码如下:
class Solution { public: int numTrees(int n) { if(n == 0)return 0; int ** DP = new int* ; for(int i = 0; i < n; i++){ DP[i] = new int ; memset(DP[i],0,4*n); DP[i][i] = 1; } for(int i = 0; i < n; i++){ for(int j = i; j >= 0; j--){ for(int k = j; k <= i; k++){ if(k > j && k < i)DP[j][i] += DP[j][k - 1] * DP[k + 1][i]; else DP[j][i] += ((k > j)?DP[j][k-1]:0) + ((k < i)?DP[k+1][i]:0); } } } return DP[0][n-1]; } };
相关文章推荐
- Unique Binary Search Trees
- [XCode] InterfaceBuilder 误操作导致的uncaught exception 'nsunknownkeyexception'异常
- 建立一个基本的UI
- easyui 可编辑表格
- ios更新UI时请尝试使用performSelectorOnMainThread方法
- Building OpenCV_contrib for OpenCV 3, Windows GUI
- [SoapUI] Read data from response , use it to update parameter
- [SoapUI] Reference parameter 引用变量
- cmake-gui出错解决方法
- [机器人开发_调试] Android手机通过OTG与Arduino主板进行串口通讯
- UISwitch开关控件
- maven 之 build lifecycle
- Win10 Build 10154新版曝光:99%的正式版
- [XCode] 通过Assistant Editor完成拖拽映射UI元素和Action
- 直接拿来用!10款实用Android UI工具
- AlertDialog.Builder(各种对话框实现)
- druid连接池配置
- 《GK101任意波发生器》升级固件发布(版本:1.0.2build851)
- !!!继承UILabel, iOS8.0 不会调用 (void)layoutSubviews
- [SoapUI] 通过SoapUI发送POST请求,请求的body是JSON格式的数据