高频面试算法题之斐波那契数

举报
程序员学长 发表于 2022/01/18 16:14:24 2022/01/18
【摘要】 读前福利,送大家一些电子书 斐波那契数509. 斐波那契数 问题描述斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给你 n ,请计算 F(n) 。示例:输入:2输出:1解释:F(2) = F(1...

读前福利送大家一些电子书

斐波那契数

509. 斐波那契数

问题描述

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 01 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给你 n ,请计算 F(n)

示例:

输入:2

输出:1

解释:F(2) = F(1) + F(0) = 1 + 0 = 1

分析问题

我们把整个求解过程分为 n 个阶段,每个阶段去求解数列对应项的值。我们在解决当前问题时,也就是求解该对应项的值的时候,会依赖过去的状态,也就是前面几项的值来计算。比如我们在求解 F(6) 的时候,我们需要用到 F(5) 和 F(4) 这两项。

我们来定义一个数组,来记录每项的状态。这个数组也叫做状态转移矩阵。按照斐波那契数列的定义:

F(0)=0, F(1)=1
F(n)=F(n-1)+F(n-2) (n>=2)

从中可以知道 F(n) 的值只与它的前两个状态有关。所以我们只要知道它的前两个状态,就可以求出 F(n)。

  1. 初始化值 F(0)=0,F(1)=1,我们直接放入数组中。
  2. 要想计算F(2),我们需要知道 F(0) 和 F(1),因为上一步已经放入数组中,我们直接拿来用就好了,然后把 F(2) 的结果放入数组中。
  3. 要想计算F(3),我们需要知道 F(2) 和 F(1),因为 F(2) 和 F(1) 已经存在数组里了,我们直接拿来用就好了,然后把 F(3) 的结果放入数组中。

依此类推,直到计算到 n 为止。整个状态转移矩阵就计算好了。如下图所示。我们以求解 F(5) 为例。

image-20211222190527104

image-20211004121243507

代码如下所示:

def fibs(n):
     if n<2:
          return n
     dp=[0 for _ in range(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]
print(fibs(6))
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。