剑指Offer 10-I. 斐波那契数列


一、题目

写一个函数,输入 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。

示例1:

输入:n = 2
输出:1

示例2:

输入:n = 5
输出:5

提示:

  • 0 <= n <=100

注意:本题与主站 509 题相同:https://leetcode-cn.com/problems/fibonacci-number/

二、思路

1. 动态规划

这一题结合题目我们可以得出状态转移方程:
$$
dp[i]=
\begin{cases}
0& \text{n=0}\
1& \text{n=1}\
dp[i-1]+dp[i-2]& \text{1 < n <= 100}
\end{cases}
$$
在最后返回结果的时候,返回的是与1000000007取模的结果。

三、代码

1. 动态规划

class Solution:
    def fib(self, n: int) -> int:
        a, b = 1, 0
        for _ in range(n):
            a, b = b, a+b
        return b % 1000000007

四、表现

method 运行时间 表现 内存消耗 表现
1. 动态规划 36ms 86.42% 13.5MB 9.16%

文章作者: Arvin He
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Arvin He !
评论
 上一篇
剑指Offer 10-II. 青蛙跳台阶问题 剑指Offer 10-II. 青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
2020-10-27
下一篇 
剑指Offer 09. 用两个栈实现队列 剑指Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素, deleteHead 操作返回-1)
2020-10-26
  目录