class Solution:
def numTrees(self, n: int) -> int:
G = [0] * (n+1)
G[0] = G[1] = 1
for i in range(2, n+1):
for j in range(1, n+1):
G[i] += G[j-1] * G[i-j]
return G[n]
class Solution:
def numTrees(self, n: int) -> int:
def countTrees(start, end):
if start > end:
return 1
res = 0
for i in range(start, end+1):
left = countTrees(start, i-1)
right = countTrees(i+1, end)
res += left * right
return res
return countTrees(1, n)
class Solution:
def numTrees(self, n: int) -> int:
memo = [[0]*(n+1) for _ in range(n+1)]
def countTrees(start, end):
if start > end:
return 1
if memo[start][end] != 0: #备忘录有记录,直接返回
return memo[start][end]
res = 0
for i in range(start, end+1):
left = countTrees(start, i-1)
right = countTrees(i+1, end)
res += left * right
memo[start][end] = res #得到结果写备忘录
return res
return countTrees(1, n)