题目描述

大家都知道斐波那契数列,现在要求输入一个整数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. Docker - 解决同步容器与主机时间报错:Error response from daemon: Error processing tar file(exit status 1): invalid symlink "/usr/share/zoneinfo/UTC" -> "../usr/share/zoneinfo/Asia/Shanghai"

    问题背景 这里讲解了如何同步容器和主机的时间:https://www.cnblogs.com/poloyy/p/13967532.html 其中使用方法二 docker cp /etc/localti ...

  2. 浅析TCP协议---转载

    https://cloud.tencent.com/developer/article/1150971 前言 说到TCP协议,相信大家都比较熟悉了,对于TCP协议总能说个一二三来,但是TCP协议又是一 ...

  3. 第二章epoll

    epoll_create:函数实现分析 /* * Open an eventpoll file descriptor. */ SYSCALL_DEFINE1(epoll_create1, int, f ...

  4. linux tcp/ip 参数解析

    后面整理相关信息/* *     TCP option lengths */#define TCPOLEN_MSS            4 //只能出现在SYN段中#define TCPOLEN_W ...

  5. Markdown语法+Typora快捷键

    1. Markdown语法 1.1 代码块生成 // 对于代码块,使用"```+编程语言"即可生成书写对应代码块的区域 // JS代码块 ​```javascript // Jav ...

  6. 怎样禁止Ceph OSD的自动挂载

    前言 本篇来源于群里一个人的问题,有没有办法让ceph的磁盘不自动挂载,一般人的问题都是怎样让ceph能够自动挂载,在centos 7 平台下 ceph jewel版本以后都是有自动挂载的处理的,这个 ...

  7. Python_网络编程_socket()

    什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 详细资 ...

  8. USACO 2020 OPEN Favorite Colors【并查集-启发式合并-思考】

    题目链接 题意简述 仰慕喜欢同色奶牛的奶牛喜欢同色 (禁止套娃 ,求一种方案,奶牛喜欢的颜色种数最多,多种方案求字典序最小. 题目解析 这道题我最先想到的居然是二分+并查集,我在想啥 咳咳 首先,考虑 ...

  9. IAR_STM32_BootLoader

    1.STM32 Bootloader与APP IROM中可以分成两个区域,起始代码运行地址为0x08000000,这是基本固定的,可以将IROM的0x08000000 ~ 0x08002000这8KB ...

  10. 新同事不讲“码”德,这SQL写得太野了,请耗子尾汁~

    今天来分享几个MySQL常见的SQL错误(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题,导致写出来的SQL语句效率低下,所以我们也可以自省自检一下. 1. LIMI ...