剑指offer 10-II 青蛙跳台阶问题
问题描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
算法分析:
递推问题,类似于斐波那契数列。设f(n)为跳到第n个台阶可能的跳法数。对于最后一跳,要么跳一步,要么跳两步,只有这两种可能。如果最后跳一步,那么该跳之前就有f(n-1)种跳法;如果跳两步,则最后一跳之前有f(n-2)种跳法,故总的跳法数为f(n)=f(n-1)+f(n-2)
代码实现1:动态规划
转移方程:f(n)=f(n-1)+f(n-2)
#python
#最后一跳,要么跳一步,要么跳两步,最后都得跳,f(n)=f(n-1)+f(n-2)实际上就考虑了最后一跳这个过程
#例如n=3
#最后跳一步f(n-1):
#1,1,1
#2,1
#最后跳两步f(n-2)
#1,2
class Solution:
def numWays(self, n: int) -> int:
a = 1
b = 1
for i in range(n):
a,b = b,a+b
return a%100000007
代码实现2:设置一个数组直接计算
设置一个数组保存数列,初始化前两个元素,则后面的元素都可以递推算得
#python
class Solution:
def numWays(self, n: int) -> int:
if n == 0 or n == 1:return 1
lst = [1,1]
for i in range(2,n+1):
lst.append(lst[i-1]+lst[i-2])
return lst[n]%1000000007