跳到主要内容

面试10- I. 斐波那契数列【动态规划经典】

题目描述

做题链接:面试10- I. 斐波那契数列【动态规划经典】

相同问题:面试10- II. 青蛙跳台阶问题【动态规划经典】

解题思路

方法一:自上而下的递归+记忆化方法

$$ F(0) = 0 \ F(1) = 1 \ F(N) = F(N - 1) + F(N - 2), 其中 N > 1. $$

但是F(4) = F(2) + F(3) ,而 F(3) = F(2)+F(1)。F(2) 被计算了2次,一旦N变的很大,F(2)会被不停的重复计算。

方法二:自下而上的动态规划

斐波那契数列的定义就是我们的动态规划方程

  • 初始状态 $F(0) = 0 ,F(1) = 1 $

  • 转移方程 $F(N) = F(N - 1) + F(N - 2)$

代码

方法一:递归

class Solution:
def fib(self, n: int) -> int:
def dfs(n):
if n in memo: return memo[n]
memo[n] = dfs(n - 1) + dfs(n - 2)
return memo[n]
memo = {0:0, 1:1}
return dfs(n) % 1000000007

方法二:动态规划

class Solution:
def fib(self, n: int) -> int:
if n == 0: return 0
dp = [0] * (n + 1)
dp[0] = 0
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[n] % 1000000007