存在对同一状态多次求值,所以用记忆化递归,dfs前面加上@lru_cache(None)当参数相同时直接返回值不需要重复计算。
lru_cache全称是Least Recently Used Cache,即最近最少使用缓存。
from functools import lru_cache
def canCross(stones: List[int]) -> bool:
@lru_cache(None)
def dfs(pos,step):
if pos==stones[-1]: return True
for d in [-1,0,1]:
if step+d>0 and pos+step+d in set(stones):
if dfs(pos+step+d, step+d):
return True
return False
pos, step = 0, 0
return dfs(pos, step)