1.通项公式法
斐波那契数的通项公式为:
因此:
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
