爬楼梯超简洁解法

题目:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

解法1:

我们用 f(x) 表示爬到第 x级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:

f(x) = f(x-1) + f(x-2)


首先要找到边界情况,即f(1)代表1级台阶,这时候就只有1这个策略,f(2)代表2级台阶,这时候只有(1,1)和2这两个策略,所以f(1)=1,f(2)=2,又因为每次只能爬1个或2个台阶,所以爬n级台阶时的最后一步只有两种情况,就是爬1个台阶,或者爬2个台阶,所以可以化简成爬n个台阶的可能情况数,就等于爬n-1个台阶的可能情况数与爬n-2个台阶数之和。

class Solution:
    def climbStairs(self, n: int) -> int:
        
        i,j = 1,2 #这是1个台阶和2个台阶时的情况,显然1个台阶时,只有一个策略就是1,2个台阶时有(1,1)和2这两种策略,这是边界情况,作为初始化的值
        for _ in range(n-1): #接下来遍历0到n-2
            i,j = j,i+j #_为0时,i=j和j=i+j就是2个台阶和3个台阶时的情况了,以此类推,_为n-2时,i就是n-2+2=n个台阶时的情况了

        return i #返回n个台阶时的可能情况数即可

解法2:

根据递推方程f(n)=f(n−1)+f(n−2),我们可以写出这样的特征方程:

其中x_{1}=\frac{1+\sqrt{5}}{2},x_{2}=\frac{1-\sqrt{5}}{2},设通解为f(n)=c_{1}x_{1}^{n}+c_{2}x_{2}^{n},代入初始条件,f(1)=1,f(2)=2,得c_{1}=\frac{1}{\sqrt{5}},c_{2}=-\frac{1}{\sqrt{5}},可以得到递推式为f(n)=\frac{1}{\sqrt{5}}[(\frac{1+\sqrt{5}}{2})^{n}-(\frac{1-\sqrt{5}}{2})^{n}] 。

class Solution:
    def climbStairs(self, n: int) -> int:
        sqrt5 = sqrt(5) #直接按照公式来编写代码,先算出根号5
        fibn = pow((1 + sqrt5) / 2, n + 1) - pow((1 - sqrt5) / 2, n + 1) #然后代入公式
        return round(fibn / sqrt5) #最后再除以根号5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会抓鼠鼠的阿猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值