[LeetCode]Unique Binary Search Trees

题目:

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

刚开始看到这道题,苦思冥想,愣了半天也没有半点思路TAT....于是google了一下这道题,才发现这题是比较经典的动态规划(Dynamic Programming)算法。由于之前没有接触过dp,所以特地停下刷题的脚步,google了大量dp算法的入门资料,具体学习过程将在“算法”栏目下另开一篇文章:动态规划学习笔记
思路:
对于动态规划,我们其实只要找到这题的状态和状态转移方程,之后代码就很好写了。经过分析,不难发现:以 1 为根的树的个数,等于左子树的个数乘以右子树的个数,左子树是 0 个元素的树, 右子树是 2 个元素的树。以 2 为根的树的个数,等于左子树的个数乘以右子树的个数,左子树是 1 个元素的树,右子树也是 1 个元素的树。依此类推。 得到状态转移方程:f(i)就等于f(k−1)×f(i−k)的和。

代码:
public class Solution {
    public int numTrees(int n) 
    {
        int[] count=new int[n+1];
        
        count[0]=1;
        count[1]=1;
        for(int i=2; i<=n; i++)
        {
            count[i]=0;
            for(int j=1;j<=i;j++)
            {
                count[i]+=count[i-j]*count[j-1];
            }
        }
        
        return count[n];
    }
}

  


本博客内容与代码均为作者Jarvis原创,如若转载请注明。

posted @ 2014-12-14 17:29  Jarvis_Wu  阅读(269)  评论(0编辑  收藏  举报