【LeetCode】96. Unique Binary Search Trees

96. Unique Binary Search Trees

Description:
Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?
Difficulty:Medium

Example:

Input: 3
Output: 5
Explanation:
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

方法1:动态规划

  • Time complexity : O ( n 2 ) O\left ( n^2 \right ) O(n2)
  • Space complexity : O ( n ) O\left ( n \right ) O(n)
    思路
    枚举[1,2......n]中每个元素作为根节点,左右两边可以递归进行求解,最后累加起来的总和即为答案,但是为了避免不必要的重复计算,使用动态规划进行求解。
    首先有一个隐藏条件,长度等长的数组能构造出来的BTS数量一样,例如[1,2,3][4,5,6]
    G(n)表示长度为n的数组可以组成BTS的数量
    F(i, n)表示i作为根节点的BTS数量
    G ( n ) = ∑ F ( i , n ) G(n)=∑ F(i,n) G(n)=F(i,n)
    F ( i , n ) = G ( i − 1 ) ⋅ G ( n − i ) F(i,n)=G(i−1)⋅G(n−i) F(i,n)=G(i1)G(ni)
    G ( n ) = ∑ ( i − 1 ) ⋅ G ( n − i ) G(n)=∑ (i−1)⋅G(n−i) G(n)=(i1)G(ni)
class Solution {
public:
    int numTrees(int n) {
        vector<int> res(n+1, 0);
        res[0] = 1;
        res[1] = 1;
        for(int i = 2; i <= n; i++)
            for(int j = 1; j <= i; j++)
                res[i] += res[j-1] * res[i-j];
        return res[n];
    }
};

方法2:数学推导

  • Time complexity : O ( n ) O\left ( n\right ) O(n)
  • Space complexity : O ( 1 ) O\left ( 1 \right ) O(1)
    思路
    C 0 = 1 , C n + 1 = 2 ( 2 n + 1 ) n + 2 C n C_{0}=1, C_{n+1} = \frac{2(2n+1)}{n+2}C_{n} C0=1,Cn+1=n+22(2n+1)Cn
class Solution(object):
    def numTrees(self, n):
        C = 1
        for i in range(0, n):
            C = C * 2*(2*i+1)/(i+2)
        return int(C)
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页