剑指 斐波那契数列

原题链接
题目分析:
斐波那契数列公式为: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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值