JZ8 跳台阶

描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

        实质上还是斐波那契数列,因为如果只有1级台阶,那么结果是1。如果有2级台阶,那么结果有两种情况:①1级台阶跳两下②一下跳2级台阶,所以结果是2。如果有3级台阶:①1级台阶跳三下②先跳2级台阶再跳一级③先跳1级台阶再跳2级,所以结果是3,这里还是有点不确定,所以再看一下如果有4级台阶:①1级台阶跳四下②2级台阶跳两下③先跳两下1级再跳2级④先跳一下1级再跳2级再跳1级⑤先跳一下2级再跳两下1级,所以结果是5。

        从这里可以考虑一下,如果有5级台阶,因为青蛙跳台阶只有1或2级的情况,所以如果最后一步是到5级台阶,那么它可以从4级台阶或者3级台阶上来。那么到4级台阶的方法有多少呢?就是上面说的f(4)=5,到3级台阶的方法有多少呢?也就是f(3)=3,所以到5级台阶的方法是f(4)+f(3)

        这里要分清楚的是,不是说到4级台阶的方法是n的话,再跳一步到5级台阶就是n+1,因为它只是多跳了一步到5级台阶,但是方法数量是没变的,比如说到4级台阶的方法是:①1级台阶跳四下②2级台阶跳两下③先跳两下1级再跳2级④先跳一下1级再跳2级再跳1级⑤先跳一下2级再跳两下1级,但是到5级台阶的方法有:①1级台阶跳四下再跳一下②2级台阶跳两下再跳一下③先跳两下1级再跳2级再跳一下④先跳一下1级再跳2级再跳1级再跳一下⑤先跳一下2级再跳两下1级再跳一下...,所以方法的数量是没变的,不过到5级台阶又可以从3级台阶上来,所以还需要加上3级台阶的方法数量。

        综上所述,它跳上n级台阶的跳法数是跳上n-1和跳上n-2级台阶的跳法数之和。也就是从n=1开始的斐波那契数列。

        所以跟JZ7的解法一样,有三种解法,分别是递归、记忆化搜索、动态规划。动态规划的时间复杂度为O(n),空间复杂度为O(1),所以用动态规划最好。

class Solution:
    def jumpFloor(self, n):
        if n < 1:
            return None
        # a 表示第 f[i-2] 项,b 表示第 f[i-1] 项
        if n == 1:
            return 1
        if n == 2:
            return 2
        a = 1
        b = 2
        for i in range(1, n-1):
            c = a + b 
            a = b 
            b = c 
        return c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值