leetcode 刷题之路 49 Unique Binary Search Trees

来源:互联网 发布:python 中文注释 编辑:程序博客网 时间:2024/05/01 15:24

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

Given 题目要求求数字1~n构成的二叉查找树共有多少种。

采用动态规划求解。使用dp数组保存中间计算结果,dp[i]表示1~i个数字构造的二叉查找树个数,dp[0],dp[1]为1,对于任意的数字0,1,2...i,可以这样构造一个查找二叉树,以数字j为根节点,数字1~j-1构造其左子树,数字j+1~i构造其右子树,j的取值为1~i,对于每个j,构造的查找二叉树可能有dp[i-j-1]*dp[j]种,所有j对应的二叉树种类数加起来就是dp[i]的值,可以看出,这是一个递归求解的问题,要求的n=i时的结果,必须知道n=0.......n-1时的结果,故可以采用递归求解,但是直接使用递归求解时间复杂度会呈指数增长,这里采用动态规划的方法,保存每次的计算结果,避免了大量运算,时间复杂度为O(n^2)。

AC code:

class Solution {public:    int numTrees(int n)     {        int *dp=new int[n+1];        memset(dp,0,(n+1)*sizeof(int));        dp[0]=dp[1]=1;        for(int i=2;i<=n;i++)        {            for(int j=0;j<=i-1;j++)            {                dp[i]=dp[i]+dp[j]*dp[i-1-j];            }        }        int ret=dp[n];        delete []dp;        return ret;    }};



0 0