【Leetcode】Fibonacci 问题整理笔记



70. Climbing Stairs

n/a

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 只是算中等。
n/a

然后看了 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 数计算问题:

n/a

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)



Reference



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值