描述
一只青蛙一次可以跳上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级台阶的方法有多少呢?就是上面说的,到3级台阶的方法有多少呢?也就是
,所以到5级台阶的方法是
。
这里要分清楚的是,不是说到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的解法一样,有三种解法,分别是递归、记忆化搜索、动态规划。动态规划的时间复杂度为,空间复杂度为
,所以用动态规划最好。
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