来自北大算法课的Leetcode题解:70. 爬楼梯

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

经典动态规划

  • 解法1: 递归 F ( N ) = F ( N − 1 ) + F ( N − 2 ) F(N) = F(N-1) + F(N-2) F(N)=F(N1)+F(N2)

  • 解法2(T30% S96%): DP解法,变为for循环,用一个数组来储存之前的状态

    • 改进(T64% S80%):不需要数组,只循环最后的两个变量
  • 解法3(T90 S99%): 数学方法斐波那契数列,递推式 → 通项公式 (注意通项公式是从0开始)

    F ( n ) = 1 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] F(n) = \frac{1}{\sqrt 5}[(\frac{1+\sqrt 5}{2})^n - (\frac{1-\sqrt 5}{2})^n] F(n)=5 1[(21+5 )n(215 )n]

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 4:
            return n

        # 解法3 通项公式
        # 注意通项公式从0开始
        return int((1/(5**0.5)) * (((1+5**0.5)/2)**(n+1) - ((1-5**0.5)/2)**(n+1)))
    
    def otherSolution(self, n):
        if n < 3:
            return n
        
        # 解法1 递归
        return self.climbStairs(n-1) + self.climbStairs(n-2)

        # 解法2 数组
        F = [0, 1, 2]
        for i in range(3, n+1):
            F.append(F[-2] + F[-1])
        return F[-1]

        # 解法2 改进 
        a, b = 1, 2
        for i in range(3, n+1):
            a, b = b, a+b
        return b
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值