题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。

n<=39

我的想法

斐波那契数列定义:F(0)=0,F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(≥ 3,∈ N*)

创建一个初始数组nums,大小为n+1,定义nums[0]=0, nums[1]=1, nums[2]=1。

从nums[3]开始依次以前两位数相加得到计算结果,直到得到nums[n],返回该结果。

# -*- coding:utf-8 -*- 解法一
class Solution:
def Fibonacci(self, n):
# write code here
if n>39:return
nums=[1]*(n+1)
nums[0]=0
for i in range(3,n+1):
nums[i]=nums[i-1]+nums[i-2]
return nums[n]

时间复杂度o(n), 空间复杂度o(n)

参考了牛客网官方解答中“记忆化搜索”的解题思路,利用大小为2的数组“折叠式”地计算F(n),减小了空间复杂度。

这里复习一下判断奇数偶数的方法:

一、n%2 
二、n&1  (这个应该计算上比较快)
 
# -*- coding:utf-8 -*- 解法二
class Solution:
def Fibonacci(self, n):
# write code here
if n>39:return
if n==0 or n==1:return n
a=[0,1]
for i in range(2,n):
if i&1==1: a[1]=a[0]+a[1]
else: a[0]=a[0]+a[1]
return a[0]+a[1]

时间复杂度o(n), 空间复杂度o(1)

与解法二相同思路的另一种解法,不用数组

# -*- coding:utf-8 -*- 解法三
class Solution:
def Fibonacci(self, n):
# write code here
if n>39:return
if n==0 or n==1:return n
a,b,c=0,1,1
for i in range(2,n):
c=a+b
a=b
b=c
return a+b

时间复杂度o(n), 空间复杂度o(1)

没想到的解法

一、递归

F(n)=F(n - 1)+F(n - 2),有这个公式就说明此题可以用递归方法得出。

只不过递归解法的时间复杂度和空间占用过高,不适合作为此题的解法,但是这种思路还是要知道的。

# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n>39: return
if (n==1 or n==2): return 1
return self.Fibonacci(n-1)+self.Fibonacci(n-2)

剑指offer二刷——数组专题——斐波那契数列的更多相关文章

  1. C#版 - 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解

    面试题9:斐波那契数列及其变形(跳台阶.矩形覆盖) 提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tp ...

  2. 剑指Offer面试题:8.斐波那契数列

    一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

  3. 剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

    递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调 ...

  4. 【剑指offer】面试题 10. 斐波那契数列

    面试题 10. 斐波那契数列 题目一:求斐波那契数列的第n项 题目描述:求斐波拉契数列的第n项 写出一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项.斐波拉契数列定义如下: C++ 实现 ...

  5. 剑指Offer面试题:7.斐波那契数列

    一 题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二 效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

  6. 《剑指offer》面试题9 斐波那契数列 Java版

    书中方法一:递归,这种方法效率不高,因为可能会有很多重复计算. public long calculate(int n){ if(n<=0){ return 0; } if(n == 1){ r ...

  7. 剑指offer 7. 递归和循环 斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 简简单单 废话不多说,直接上代码: public class Sol ...

  8. 剑指offer——面试题10:斐波那契数列

    个人答案: #include"iostream" #include"stdio.h" #include"string.h" using na ...

  9. 剑指Offer(书):斐波那契数列

    题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 分析:第一种方法:递归,45时,时间为5s,50时,我就等不及了.原因是重 ...

随机推荐

  1. RBD快速删除的方法分析与改进

    前言 这个问题在很久以前就有一篇文章进行过讨论 remove-big-rbd,这个文章写的比较清楚了,并且对不同的方法做了分析,这里先把结论说下 rbd类型 rbd rm 方法 rados -p rm ...

  2. ImportError: No module named 'chardet'

    1.使用requsets出现这个错误,ImportError: No module named 'chardet' 原因:requests依赖其他一些模块 解决:依次使用pip安装即可 pip ins ...

  3. bWAPP----HTML Injection - Reflected (URL)

    HTML Injection - Reflected (URL) 核心代码 1 <div id="main"> 2 3 <h1>HTML Injection ...

  4. springboot中aop的使用

    Spring AOP(Aspect Oriented Programming),即面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的补充和完善. OOP引 ...

  5. 企业级工作流解决方案(九)--微服务Tcp消息传输模型之客户端处理

    客户端启动 客户端启动主要做三件事情,1. 从配置文件读取服务调用配置,存储到全局对象中.2. 指定客户端编解码器工厂.3. 预连接,即预先建立与服务端的通信Chanel. [DependsOn(ty ...

  6. MindManager 2021 版新增了哪些功能

    MindManager Windows 21是一款强大的可视化工具和思维导图软件,在工作应用中有出色的表现.今天就带大家来看下这个新版本增加了哪些功能? 1.新增现代主题信息样式MindManager ...

  7. 程序员说:为什么喜欢大量使用 if……else if替代switch?

    请用5秒钟的时间查看下面的代码是否存在bug. OK,熟练的程序猿应该已经发现Bug所在了,在第13行下面我没有添加关键字break; 这就导致这段代码的行为逻辑与我的设计初衷不符了. 缺点一. 语法 ...

  8. Istio 之ServiceEntry

    使用服务条目资源(ServiceEntry)可以将条目添加到 Istio 内部维护的服务注册表中.添加服务条目后,Envoy 代理可以将流量发送到该服务,就好像该服务条目是网格中的服务一样.通过配置服 ...

  9. python—数据类型和变量

    在python中,能够直接处理的数据类型和变量有整数.浮点数.字符串.布尔值.空值.变量. 一.整数 1.python可处理任意大小的整数,包括负整数,在程序中的表示方法与在数学中的方法一样.例如:0 ...

  10. c++11-17 模板核心知识(十一)—— 编写泛型库需要的基本技术

    Callables 函数对象 Function Objects 处理成员函数及额外的参数 std::invoke<>() 统一包装 泛型库的其他基本技术 Type Traits std:: ...