最近没有刷 leetcode,并不是因为懒,而是最近在刷《剑指offer》和《程序员代码面试指南》,代码都在牛课网上,以后还可以回顾。并且最近看了一部奇书《深度探索C++对象模型》,这应该是我看过最玄幻的语言类书籍了。目前看了 4 章,感觉大有脾益,顿悟了好多以前关于 C++ 面向对象的设计的思维,以及明白了为什么我以前某某方式编译老不通过的原因。
【题目】
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
【代码】
class Solution {
public:
int numTrees(int n) {
//解法一:非递归DP,每个结点i∈[1..n]的BST数目等于其左右子树即[1..i]和[i+1..n]的BST数目之积
/*
if(n <= 0)
return -1;
vector<int> dp(n+1, 0);
dp[0] = 1;
for(int i=1; i<=n; ++i){
for(int j=0; j<i; ++j)
dp[i] += dp[j] * dp[i-j-1];
}
return dp[n];
*/
//解法二:递归,同样是上述思路,按照左右子树结点数目不同,由小到大计算左右子树数目之积,然后把所有结果
if(n <= 1)
return 1;
int res = 0;
for(int i=1; i<=n; ++i)
res += numTrees(i-1) * numTrees(n-i); //+=
return res;
}
};主要还是动态规划,注意累加的思想。
本文介绍了作者近期的学习进展,包括阅读《深度探索C++对象模型》的心得体会,以及对该书中C++面向对象设计思想的理解。此外,还分享了一个LeetCode问题——计算不同结构的二叉搜索树的数量,并提供了两种解法:动态规划的非递归方法和递归方法。
341

被折叠的 条评论
为什么被折叠?



