解法1:
这道题和95题 Unique Binary Search Trees II很像,但是解题思路却相差很多。先用上一道题的思路按照递归写了一下,最后TLE超时了,后来想了一下超时原因,发现这道题由于只用输出个数,不用输出具体的树,所以右边界和左边界的差值相同的子树,数量都是相同的,所以就可以打个表,把已经算过的右边界和左边界的差值记录下来,下次再遇到相同的范围时,可以直接从表中获得结果,不用再回溯了。
需要注意在为表赋初始值时,一定要注意这个初始值能否真正到达。最开始我设置了result_list[1]=2,并没有考虑到n=1的情况,WA了一发,以后一定要注意。
class Solution:
def numTrees(self, n: int) -> int:
if n <= 0:
return 0
# 用于打表,索引是右边界和左边界的差值
result_list = [0 for i in range(n)]
result_list[0] = 1
def recurse(begin: int, end: int) -> int:
if begin >= end:
return 1
if result_list[end-begin] != 0:
return result_list[end-begin]
result = 0
for i