题目描述:
写一个函数,输入 n
,求斐波那契(Fibonacci)数列的第 n
项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
输入:n=2 输出:1 输入:n=5 输出:5
斐波那契数列是一个经典的一维动态规划问题,动态规划的精髓就是通过记住一些事情来节省时间。
关于动态规划问题现在还不能完全总结清楚,可能要等到后面再来补充了。
class Solution: # 一维动态规划
def fib(self, n):
num = {}
num[0] = 0
num[1] = 1
if n > 1:
for i in range(2, n+1):
num[i] = num[i-1] + num[i-2]
return int(num[n]%(1000000007))
horizon = Solution()
print(horizon.fib(5))
分析:
使用一个长度为 n+1
的数组 dp
,dp[i]
为 F(N)
的值。然后初始化 dp[0]
,dp[1]
,计算每个位置上的值,最后返回第 n 项。
还有一个跳台阶问题和斐波那契数列类似,都是一维动态规划问题。
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
输入:n=2 输出:2 输入:n=7 输出:21
class Solution:
def numWays(self, n: int) -> int:
num = {}
num[0] = 1
num[1] = 1
if n > 1:
for i in range(2,n+1):
num[i] = num[i-1] + num[i-2]
return num[n]%1000000007
分析:
从第三级台阶开始,每一级能到的途径有两种:
从前一个台阶跳一步上来
从前两个台阶跳两步上来
那么到第n级台阶的方法数量就是前一步的结果加上前前一步的结果(是不是跟斐波那契数列一毛一样)。
或者说到某一级台阶的方法数量就是到前两级台阶方法数的和,忽略到前两级台阶的过程,当成两个点来记录方法数量。