LeetCode-斐波那契数用python解决的方法

1.通项公式法

斐波那契数的通项公式为:

F(n)=\frac{ { (\frac{1+\sqrt{5}}{2}})^n -{(\frac{1-\sqrt{5}}{2})^n} }{\sqrt{5}}

因此:

import math
class Solution(object):
    def fib(self, N):
        """
        :type N: int
        :rtype: int
        """
        a = math.sqrt(5)
        b = (1+a)/2
        c = (1-a)/2
        return (pow(b,N)-pow(c,N))/a

一行

import math
class Solution(object):
    def fib(self, N):
        """
        :type N: int
        :rtype: int
        """
        return int((pow((1+math.sqrt(5))/2,N)-pow((1-math.sqrt(5))/2,N))/math.sqrt(5))
        

通项公式法花费24ms时间,不是最快的时间,最快的是4ms。

2.最快的是4ms

class Solution(object):
    def __init__(self):
        self.docker = {}
    def fib(self, N):
        """
        :type N: int
        :rtype: int
        斐波那契数列,使用递归
        """
        if self.docker.get(N) is not None:
            return self.docker[N]
        if (N == 2) or (N == 1):
            self.docker[1] = 1
            self.docker[2] = 1
            return 1
        if N == 0:
            return 0
        temp = self.fib(N - 1) + self.fib(N - 2)
        self.docker[N] = temp
        return temp

分析:

 

3.8ms

class Solution(object):
    def fib(self, N):
        """
        :type N: int
        :rtype: int
        """
        if N == 0:
            return 0
            
        if N <= 2 :
            return 1
        
        pre =1 
        ppre =1
        
        for i in range(2,N):
            tem = pre 
            pre = pre + ppre
            ppre = tem
            
        return pre

 

4.12ms

 

class Solution(object):
    def fib(self, N):
        """
        :type N: int
        :rtype: int
        """
        A = [0, 1]
        for i in range(N - 1):
            A.append(A[-1] + A[-2])
        return A[N]
        

5.16ms

class Solution(object):
    def fib(self, N):
        """
        :type N: int
        :rtype: int
        """
        if N == 0:
            return 0
        if N == 1:
            return 1
        pre1 = 1
        pre2 = 0
        res = 0
        for i in range(N-1):
            res = pre1 + pre2
            pre2 = pre1
            pre1 = res
        return res

 

6.20ms

class Solution(object):
    def fib(self,N):
        if N in [0, 1]:
            return N
        a, b = 0, 1
        while N > 1:
            a, b = b, a + b
            N -= 1
        return b

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值