LeetCode96. 不同的二叉搜索树

题目

分析

首先要画个草图观察规律,n = 1 ,2, 3 时,结果分别为1,2,5。分析当 n = 3时,BST的种类构成:根节点为1,根节点为2,根节点为3。当根节点为1时,有两种形态

 

 当根节点为2时,有一种形态

 

 当根节点为3时,有两种形态

 

 所以n为3时的BST数量为:根节点为1的BST个数 + 根节点为2的BST个数+根节点为3的BST个数。设dp【i】为从1—i组成的BST个数。dp[3] = dp[2] * dp[0] + dp[1] * dp[1]+

dp[0] * dp[2]

进而可得动态转移方程 dp[i] += dp[j - 1] * dp[i - j]

代码

 1 class Solution {
 2 public:
 3     int numTrees(int n) {
 4         vector<int>dp(n+1);
 5         dp[0] = 1;
 6         for(int i = 1;i <= n;i++){
 7             for(int j = i -1;j >= 0;j--){
 8                 dp[i] += dp[j] * dp[i-j-1];
 9             }
10         }
11         return dp[n];
12     }
13 };

 时间复杂度O(N2),空间复杂度O(N)

posted @ 2021-02-12 21:40  Uitachi  阅读(23)  评论(0编辑  收藏  举报