70. Climbing Stairs
Solution:
不算很简单,也不算很明显。
先将一阶,二阶,三阶,四阶,… 一个个爬阶方法写出,然后推出来。
1+2 => 3
3+5 => 8
猜测。
可不可以使用增强归纳假设解决这个问题呢。
实现:
from functools import lru_cache
class Solution:
@lru_cache()
def fibonacci(self, n):
if n == 1:
return 1
elif n == 2:
return 2
else:
return self.fibonacci(n-1) + self.fibonacci(n-2)
def climbStairs(self, n: int) -> int:
return self.fibonacci(n)
比较意外的是,使用了缓存函数返回值的技术竟然 solution 只是算中等。
然后看了 Leetcode 的 Solution 分析。看起来确实有更快的方法(比如不用递归,节省了栈开销)。
之所以缓存很够起作用的原因是 return self.fibonacci(n-1) + self.fibonacci(n-2)
这一调用,会先执行 self.fibonacci(n-1)
。
而显然,self.fibonacci(n-1)
内部会先执行 self.fibonacci((n-1)-1)
。所以这样相当于总是节省了另外一侧(+
后面的调用)的计算量。
总的计算量只有
O
(
n
)
O(n)
O(n)
509. Fibonacci Number
原生的 Fibonacci 数计算问题:
Solution:
解法和上面的几乎一样。
from functools import lru_cache
class Solution:
@lru_cache()
def fib(self, N: int) -> int:
if N == 0:
return 0
elif N == 1:
return 1
else:
return self.fib(N-1) + self.fib(N-2)