原题链接
题目分析:
斐波那契数列公式为:f[n] = f[n-1] + f[n-2], 初始值f[0]=0, f[1]=1,目标求f[n]
1.直接根据公式使用递归,一般会导致运行超时
class Solution:
def Fibonacci(self, n):
# write code here
if n==0 or n==1:
return n
return self.Fibonacci(n-1)+self.Fibonacci(n-2)
2.使用列表
class Solution:
def Fibonacci(self, n):
# write code here
num_list = [0,1]
if n<=1:
return n
for i in range(1,n):
num_list.append(num_list[-1]+num_list[-2])
return num_list[-1]
时间复杂度O(n)
空间复杂度O(n)
参考链接
关于浅拷贝和深拷贝:
深拷贝是指使用一块新的与原对象相同大小的内存,将需要拷贝的对象的所有值都拷贝到新的内存位置中,拷贝出来的对象与原对象互相独立。使用深拷贝赋值,传的是值。
浅拷贝是指使用原对象的引用作为拷贝的对象,而不使用新的内存存放拷贝出来的对象,拷贝的对象与原对象共用同一块内存,所以对其中任一个做修改,另一个也会随之改变。使用浅拷贝赋值,传的是引用。
append()函数使用的是浅拷贝。
深拷贝的使用方法
可以使用copy模块中的deepcopy()函数:
from copy import deepcopy
mylist = []
x = [1, 2, 3]
mylist.append(deepcopy(x))
3.动态规划
由于 F(n)F(n) 只和 F(n-1)F(n−1) 与 F(n-2)F(n−2) 有关,因此可以使用「滚动数组思想」把空间复杂度优化成 O(1).只需要两个数值,不需要记录整个数组.
class Solution:
def Fibonacci(self, n):
# write code here
if n<=1:
return n
p,q=0,1 #只需要两个变量,不断给p、q重新赋值就可以
for i in range(1,n):
p,q=q,p+q
return q
时间复杂度:O(n)
空间复杂度:O(1)