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慢的多啊。

浙公网安备 33010602011771号