这道题比较厉害,起初以为在95.Unique Binary Search TreesII进行计数就行,后来才发现别有洞天,很有意思。当然,解决思路也有两个。
一.递归思路。这个和95.Unique Binary Search TreesII很像,但细节很重要。
class Solution {
int[] dp;
public int numTrees(int n) {
dp = new int[n];
if(n==0){
return 0;
}
return getTrees(1,n);
}
private int getTrees(int l, int r){
if(l>r){
return 1;
}
if(l==r){
return 1;
}
if(dp[r-l]!=0){
return dp[r-l];
}
int left_count, right_count;
int count=0;
for(int i=l; i<=r; i++){
left_count = getTrees(l, i-1);
right_count = getTrees(i+1, r);
count+= left_count*right_count;
}
dp[r-l] = count;
return count;
}
}
二.动态规划。
直接贴solution
public class Solution {
public int numTrees(int n) {
int[] G = new int[n + 1];
G[0] = 1;
G[1] = 1;
for (int i = 2; i <= n; ++i) {
for (int j = 1; j <= i; ++j) {
G[i] += G[j - 1] * G[i - j];
}
}
return G[n];
}
}