本文记录LeetCode刷题一些知识点,水平有限还望多多指正
斐波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, 且在 n >= 0 的条件下 Tn+2 = Tn + Tn+1
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。
方法一:使用递归
class Solution:
def fabonacci(self, n: int) -> int:
if n<2:return n
return self.tribonacci(n-1)+self.tribonacci(n-2)
结果:超时
改进:使用lru缓存加速
import functools
class Solution:
@functools.lru_cache(None)
def fabonacci(self, n: int) -> int:
if n<2:return n
return self.tribonacci(n-1)+self.tribonacci(n-2)
结果:38ms 13.8 MB
方法二:使用循环
class Solution:
def fabonacci(self, n: int) -> int:
a, b = 0, 1
for i in range(n) :
a, b = b, a+b
return a
结果:40ms 13.8 MB
Note:functools
模块
functools
模块用于高阶函数,作用与或者返回其它函数的函数。一般来说,对于该模块,任何可调用对象都可以视为一个函数
-
@functools.lru_cache(maxsize=128, typed=False)
:该函数装饰器使用 LRU缓存算法来缓存相对耗时的函数结果,避免传入相同的参数重复计算。同时,缓存并不会无限增长,不用的缓存会被释放。其中 maxsize 参数用于设置缓存占用的最大字节数,typed 参数用于设置将不同类型的缓存结果分开存放。
除此之外模块中还有:
functools.cmp_to_key(func)
:将老式的比较函数(func)转换为关键字函数(key function)。在 Python 3 中比较大小、排序都是基于关键字函数的,Python 3 不支持老式的比较函数。@functools.total_ordering
:这个类装饰器(作用类似于函数装饰器,只是它用于修饰类)用于为类自动生成比较方法。通常来说,开发者只要提供 lt()、le()、gt()、ge() 其中之一(最好能提供 eq() 方法),@functools.total_ordering装饰器就会为该类生成剩下的比较方法。functools.partial(func, *args, **keywords)
:该函数用于为 func 函数的部分参数指定参数值,从而得到一个转换后的函数,程序以后调用转换后的函数时,就可以少传入那些己指定值的参数。functools.partialmethod(func, *args, **keywords)
:该函数与上一个函数的含义完全相同,只不过该函数用于为类中的方法设置参数值。functools.reduce(function, iterable[, initializer])
:将初始值(默认为 0,可由 initializer 参数指定)、迭代器的当前元素传入 function 函数,将计算出来的函数结果作为下一次计算的初始值、迭代器的下一个元素再次调用 function 函数……依此类推,直到迭代器的最后一个元素。@functools.singledispatch
:该函数装饰器用于实现函数对多个类型进行重载。比如同样的函数名称,为不同的参数类型提供不同的功能实现。该函数的本质就是根据参数类型的变换,将函数转向调用不同的函数。functools.update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES
:对 wrapper 函数进行包装,使之看上去就像 wrapped(被包装)函数。@functools.wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
:该函数装饰器用于修饰包装函数,使包装函数看上去就像 wrapped 函数。
通过介绍不难发现,functools.update_wrapper
和 @functools.wraps
的功能是一样的,只不过前者是函数,因此需要把包装函数作为第一个参数传入;而后者是函数装饰器,因此使用该函数装饰器修饰包装函数即可,无须将包装函数作为第一个参数传入。