Unique Binary Search Trees
2016-07-08 09:51
429 查看
设C0 = 1,只有一个元素时可行的BST数量C1 = 1,有两个元素时可行的BST数量C2 = 2 ,C3 = C0*C2 + C1*C1 + C2*C0 , C4 =......
这就是卡特兰数的定义。
所以用动态规划来做。
然而这种规律太难找了,我更倾向于寻找有启发性的思路。
因为对于每一个节点,只有两种状态:作为根节点或不作为根节点,有二分的思想,然而很明显这道题不能用二分法做,同时想到二分法和动态规划的相似点(见我的另一篇博客http://blog.csdn.net/popvip44/article/details/51704994),所以考虑用动态规划来做。
即:
n == 0 时,空树的个数必然为1,因此dp[0] = 1
n == 1 时,只有1这个根节点,数量也为1,因此dp[1] = 1
n == 2时,有两种构造方法,dp[2] = dp[0] * dp[1] + dp[1] * dp[0] (0为根节点,1为根节点)
n == 3时,dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0] (0为根节点,2为子树根节点或者不为子树根节点; 1为根节点,因为1是mid位置,所以只有一种结构; 2为根节点,0为或不为子树根节点)
由卡特兰数计算公式得:
class Solution {
public:
int numTrees(int n) {
if (n <= 0)
return 0;
if (n == 1)
return 1;
vector<int> res(n+1,0) ;
res[0]=1;
res[1]=1;
for (int i = 2; i <=n; i++)
{
for (int j = 0; j<i; j++)
{
res[i] += res[j] * res[i - j-1];
}
}
return res.back();
}
};
这就是卡特兰数的定义。
所以用动态规划来做。
然而这种规律太难找了,我更倾向于寻找有启发性的思路。
因为对于每一个节点,只有两种状态:作为根节点或不作为根节点,有二分的思想,然而很明显这道题不能用二分法做,同时想到二分法和动态规划的相似点(见我的另一篇博客http://blog.csdn.net/popvip44/article/details/51704994),所以考虑用动态规划来做。
即:
n == 0 时,空树的个数必然为1,因此dp[0] = 1
n == 1 时,只有1这个根节点,数量也为1,因此dp[1] = 1
n == 2时,有两种构造方法,dp[2] = dp[0] * dp[1] + dp[1] * dp[0] (0为根节点,1为根节点)
n == 3时,dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0] (0为根节点,2为子树根节点或者不为子树根节点; 1为根节点,因为1是mid位置,所以只有一种结构; 2为根节点,0为或不为子树根节点)
由卡特兰数计算公式得:
class Solution {
public:
int numTrees(int n) {
if (n <= 0)
return 0;
if (n == 1)
return 1;
vector<int> res(n+1,0) ;
res[0]=1;
res[1]=1;
for (int i = 2; i <=n; i++)
{
for (int j = 0; j<i; j++)
{
res[i] += res[j] * res[i - j-1];
}
}
return res.back();
}
};
相关文章推荐
- 关于apue第二章获取绝对路径长度程序path_alloc()分析
- 关于Kendo ui 的简单介绍
- uibutton图片,文字上下排列
- cc.sequence和this.scheduleOnce连用的缺点
- jd-gui 反编译后去除注释
- 绑定一把枪到手上,添加一个开枪的效果
- 如何用UE(UltraEdit)删除重复行?--转
- UITabView/UICollectionView 全选问题
- 【iOS】UITabView/UICollectionView 全选问题
- Implement Queue using Stacks
- 处理编译错误"0" is an invalid value for the "DebugInformation" parameter of the "DCC"
- HDU 5531(Rebuild- 三分)
- Longest Increasing Subsequence
- Gradle version 2.20 is required. Current version is 2.10 解决方法
- Vue.js学习 Item8 -- 方法与事件处理器
- mui框架如何实现页面间传值
- Vue.js学习 Item7 -- 条件渲染与列表渲染
- UITableViewCell重用时遇到的问题
- Vue.js学习 Item6 -- Class 与 样式绑定
- Data Import Request Handler