码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 96. Unique Binary Search Trees

时间:2019-09-30 20:05:16      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:lse   cto   log   代码   原来   记忆   leetcode   tps   code   

题意:给定一个数n,求出1~n,所有二叉树的个数;

 

在LeetCode 95中,要你求出所有二叉树,并返回结点,题解见:https://www.cnblogs.com/yy-1046741080/p/11594454.html

原来我就想用直接递归,来求出结点个数的,结果发现TE; 在近期了解了DP后,修改了一下源代码,就顺利过了,但是空间效率并不是很理想,因为DP记录了很多数据,可能也是我DP用的不太好导致的。

 

另外,关于二维数组的动态内存申请还是值得记忆一下的;(虽然可以使用vector来定义指定长度)

 

要点:

  1. 递归函数:计算 [left,right) 序列形成的二叉树个数 ;     在该函数,令每一个点都可以作为顶点,然后每一次个数等于左子树个数*右子树个数;然后累加就得到结果;在递归边界时,为1 ;
  2. 使用array[left][right)来记录[left,right)序列生成的二叉树个数;默认为-1;如果不为-1,说明已经计算过了,直接套用就行了。 (我认为的DP的关键就是:减少重复计算,以空间换取时间)
 1 class Solution {
 2 public:
 3     // [left,right)
 4     int CalNum(int left,int right,int** array){
 5         if(left>=right){
 6             array[left][right]=1;
 7             return 1;
 8         }
 9         else{
10             int sum=0;
11             for(int i=left;i<right;i++){
12                 if(array[left][i]==-1){
13                     array[left][i]=CalNum(left,i,array);
14                 }
15                 if(array[i+1][right]==-1){
16                     array[i+1][right]=CalNum(i+1,right,array);
17                 }
18                 sum+=array[i+1][right]*array[left][i];
19             }
20             return sum;
21         }
22     }
23     
24     int numTrees(int n) {
25         // DP array  
26         int** array;
27         array=new int*[n+2];
28         for(int i=1;i<=n+1;i++){
29             array[i]=new int[n+2];
30             for(int j=1;j<=n+1;j++){
31                 array[i][j]=-1;
32             }
33         }
34         
35         return CalNum(1,n+1,array);
36     }
37 };

 

LeetCode 96. Unique Binary Search Trees

标签:lse   cto   log   代码   原来   记忆   leetcode   tps   code   

原文地址:https://www.cnblogs.com/yy-1046741080/p/11613945.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!