Leetcode96. Unique Binary Search Trees

这题开始只想到了用dp,但是没有总结出规律来,辣鸡辣鸡。
其实思路不难的:
不妨设dp[i]表示,用[1,i]的数建BST的可行数量。f(j,i)表示以j为根节点,用[1,i]的数构建BST的可行树数量。
我们用1-n的数构建BST(binary search tree)时,会依次用[1,n]的数作为根节点。于是有\(dp[i] = \sum\limits_{j=1}^i f(j,i)\)
对于根节点i,小于i的数[1,i-1]在根节点的左子树,大于i的数[i+1,n]在根节点i的右子树,然后依次递归建树。
于是有f(j,i)=dp(j-1)*dp(i-j)。
于是递推公式:
\(dp[i] = \sum\limits_{j=1}^i dp(j-1)*dp(i-j)\)

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

Runtime: 0 ms, faster than 100.00% of Java online submissions for Unique Binary Search Trees.
Memory Usage: 32.1 MB, less than 34.88% of Java online submissions for Unique Binary Search Trees.

Python版本:

class Solution:
    def numTrees(self, n: int) -> int:
        if n<0:
            return 0
        
        dp = [0 for i in range(n+1)]
        dp[0]=dp[1]=1
        for i in range(2,n+1):
            for j in range(1,i+1):
                dp[i]+=dp[j-1]*dp[i-j]
        return dp[n]

Runtime: 32 ms, faster than 94.25% of Python3 online submissions for Unique Binary Search Trees.
Memory Usage: 13.2 MB, less than 38.03% of Python3 online submissions for Unique Binary Search Trees.
Python还是比Java慢的多啊。

posted @ 2019-06-01 16:37  大胖子球花  阅读(115)  评论(0)    收藏  举报