一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
解题思路
动态规划
我们根据台阶来推出子问题:跳上n阶台阶的前提是跳上n-1阶或者n-2阶,所以我们要求得N阶台阶的跳法,只要知道N-1阶的跳法和n-2阶的跳法,将两者相加就得到了n阶台阶最优解。
这里就涉及到了动态规划的最优子结构,也就是问题的最优解由子问题的最优解得到。此外,在跳到n-1、n-2阶之后,如果选择下一种跳法,不会影响到N-1、N-2阶台阶最优解的决策,符合无后效性。还有,n-1和n-2都包括了n-3阶台阶跳两步和一步,这里N-3在这里就被重复计算了,符合重复子问题。
算法复杂度:时间复杂度O(N)
空间复杂度O(N)
Python
class Solution(object):
def numWays(self, n):
"""
:type n: int
:rtype: int
"""
if n <= 1:
return 1
dp = [1 for i in range(n+1)]
for i in range(2, n+1):
dp[i] = (dp[i-1] + dp[i-2]) % 1000000007
return dp[n]
斐波那契
这里的台阶问题很符合斐波那契数列的思想,其实就是在求斐波那契数列的第n个数
Python
class Solution(object):
def numWays(self, n):
"""
:type n: int
:rtype: int
"""
if n <= 1:
return 1
a, b = 1, 1
while n > 1:
a, b = b, a+b
n -= 1
return b % 1000000007