最近没有刷 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;
}
};
主要还是动态规划,注意累加的思想。