力扣279.完全平方数
class Solution:
def numSquares(self, n: int) -> int:
from functools import lru_cache
from math import sqrt
@lru_cache()
def dfs(n):
if n <= 1:
return n
ans = inf
for i in range(int(sqrt(n)), 0 , -1):
ans = min(ans, dfs(n%(i*i))+n//(i*i))
return ans
return dfs(n)
这里用了lru_cache()装饰器记录dfs的结果,很多时候超时的代码加上这个就能过。但是时间还是会比较长。
还有在使用递归的时候,使用这个也很顶,比如经典的递归的题力扣 509. 斐波那契数
class Solution:
def fib(self, n: int) -> int:
if n <= 1:
return n
return self.fib(n-1)+self.fib(n-2)
不加装饰器的结果
加了装饰器后的结果
class Solution:
@functools.lru_cache()
def fib(self, n: int) -> int:
if n <= 1:
return n
return self.fib(n-1)+self.fib(n-2)
在139. 单词拆分中加入这个也能从不ac到ac
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
def back_tracking(s):
if not s:
return True
res = False
for i in range(1, len(s)+1):
if s[:i] in wordDict:
res = back_tracking(s[i:]) or res
return res
return back_tracking(s)
加入装饰器后
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
@functools.lru_cache()
def back_tracking(s):
if not s:
return True
res = False
for i in range(1, len(s)+1):
if s[:i] in wordDict:
res = back_tracking(s[i:]) or res
return res
return back_tracking(s)