class Solution { public: int numTrees(int n) { vector<int> f(n+1,0); f[0]=1; f[1]=1; for(int i=2;i<=n;i++){ for(int j=1;j<=i;j++){ f[i]+=f[j-1]*f[i-j]; } } return f[n]; } };
补充一个python的实现:
1 class Solution: 2 def numTrees(self, n: 'int') -> 'int': 3 if n==1: 4 return 1 5 else: 6 dp = [1] * (n+1) 7 #dp[0]=1 8 #dp[1]=1 9 for t in range(2,n+1):#2->n 10 i=0 11 j=t-1 12 sums = 0 13 while i<=t-1 and j>=0: 14 sums += dp[i] * dp[j] 15 i+=1 16 j-=1 17 dp[t]=sums 18 return dp[n]
这道题的思路是,从1到n,依次选择某节点作为根节点。假设n=2,
1为根节点:比1小的元素有0个,比1大的元素有1个,因此有dp[0]*dp[1]
2为根节点:比2小的元素有1个,比2大的元素有0个,因此有dp[1]*dp[0]
这两种情况之和,即为dp[2]。
再假设n=3,因为之前已经计算过dp[2]的值了,dp[2]表示2个节点的组合数量,现在要计算dp[3]
1为根:dp[0]*dp[2]
2为根:dp[1]*dp[1]
3为根:dp[2]*dp[0]
以上三项之和为dp[3],最终返回dp[n]即为所求。