斐波那契数列
难度:简单
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
解法一、暴力递归
时间复杂度:
O
(
2
n
)
O(2^n)
O(2n)
空间复杂度:
O
(
1
)
O(1)
O(1)
class Solution:
def fib(self, n: int) -> int:
if n in [0, 1]:
return n
else:
return (self.fib(n-1) + self.fib(n-2)) % 1000000007
解法二、去重递归
思路:
递归得出具体数值之后,存储到一个集合(下标与数列下标一致),后面递归之前先到该集合查询一次,如果查到则无需递归,直接取值。查不到再进行递归计算。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
class Solution:
hashmap = dict()
def fib(self, n: int) -> int:
if n < 2:
return n
if self.hashmap.get(n):
return self.hashmap.get(n)
self.hashmap[n] = (self.fib(n-1) + self.fib(n-2)) % 1000000007
return self.hashmap[n]
解法三、双指针迭代
思路:
基于去重递归优化,集合没有必要保存每一个下标值,只需保存前两位即可,向后遍历,得出N的值。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
class Solution:
def fib(self, n: int) -> int:
if n in [0, 1]:
return n
left = 0
right = 1
for i in range(n-1):
mid = left + right
left = right
right = mid
return right % 1000000007
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fei-bo-na-qi-shu-lie-lcof/