题目描述

大家都知道斐波那契数列,现在要求输入一个整数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. Vue3.0初体验

    最近看了Vue3.0的相关信息,相比Vue2.0有以下优点: Performance:性能更比Vue 2.0强. Tree shaking support:可以将无用模块"剪辑", ...

  2. GDB的原理

    gdb调试不管是本地调试还是远程调试,都是基于ptrace系统调用来实现. ptrace系统调用提供了一种方法,让父进程可以观察和控制其它进程的执行,检查和改变其核心映像及寄存器.主要用来实现断点调试 ...

  3. Go语言内存分配(简述 转)

    在Go语言里,从内存的分配到不再使用后内存的回收等等这些内存管理工作都是由Go在底层完成的.虽然开发者在写代码时不必过度关心内存从分配到回收这个过程,但是Go的内存分配策略里有不少有意思的设计,通过了 ...

  4. ceph集群的安装和配置教程

    本篇主题: 1.怎样配置ssh免登陆访问 2.为什么搭建集群要关闭防火墙和selinux,如何关闭 3.从哪里获取ceph的安装包,怎样安装才是快速正确的 4.为什么要配置时间同步服务,怎样配置 5. ...

  5. 测试_QTP使用

    1.Qtp是什么? QTP是Quick Test Professional的简称,是一种自动测试工具.使用QTP的目的是想用它来执行重复的自动化测试,主要是用于回归测试和测试同一软件的新版本.(百度百 ...

  6. metasploit数据库使用学习

    metasploit为了方便,自动将当前工作区的内容放入数据库 首先就是工作区 -a 增加工作区,-d删除工作区 不同工作区的内容会分开储存到数据库 default工作区 test工作区 db_imp ...

  7. 阿里面试官:小伙子,给我说一下Spring 和 Spring Boot 的区别吧

    前言 对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot的我当时也是一头雾水,随着经验的积累.我慢慢理解了这两个框架到底有什么区别,相信对 ...

  8. pip更新报错问题

    pip更新错误如下: WARNING: You are using pip version 20.1.1; however, version 20.2 is available. You should ...

  9. http 文件上传

    参考https://www.cnblogs.com/yuwei0911/p/8601542.html

  10. Linux下使用Docker部署nacos-server(单机模式),丧心病狂的我在半夜给UCloud提交了一份工单

    1. 拉取nacos-server镜像 进入 Docker Hub 查看nacos-server最新版本为 nacos-server:1.4.0 配置阿里云镜像加速 sudo mkdir -p /et ...