题目描述
大家都知道斐波那契数列,现在要求输入一个整数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)(n ≥ 3,n ∈ 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)