剑指offer二刷——数组专题——斐波那契数列

题目描述

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

 

 

 

 

 

 

 

posted @ 2020-08-13 21:19  Olebaba  阅读(161)  评论(0)    收藏  举报