斐波那契数是经典的递归解法,其定义为F(n)=F(n-1)+F(n-2),但是对于较大的𝑛,这种递归方法会非常慢。因为每次计算fib(n)时,它会重复计算许多子问题。例如,计算fib(5) 会计算fib(3) 两次,计算fib(2)三次,等等。这导致了大量的重复计算,时间复杂度为 O ( 2 n ) O(2^n) O(2n)。可以考虑滚动数组的思想优化算法效率,这种只需要遍历一次数组且不需要额外的变量,时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)
python
class Solution(object):
def fib(self, n): # 递归解法
"""
:type n: int
:rtype: int
"""
if n == 0:
return 0
if n == 1:
return 1
return self.fib(n - 1) + self.fib(n - 2)
def fib(self, n): # 滚动数组
a = 0
b = 1
if n == 0:
return 0
if n == 1:
return 1
ans = a + b
while n > 2:
a = b
b = ans
ans = a + b
n -= 1
return ans
def fib(self, n: int) -> int: # 滚动数组规范化写法
MOD = 10 ** 9 + 7
if n < 2:
return n
p, q, r = 0, 0, 1
for i in range(2, n + 1):
p = q
q = r
r = (p + q) % MOD
return r
看了题解滚动数组的方法其实还可以再优化,也就是用矩阵快速幂的方法降低时间复杂度
python
class Solution:
def fib(self, n: int) -> int:
MOD = 10 ** 9 + 7
if n < 2:
return n
def multiply(a: List[List[int]], b: List[List[int]]) -> List[List[int]]:
c = [[0, 0], [0, 0]]
for i in range(2):
for j in range(2):
c[i][j] = (a[i][0] * b[0][j] + a[i][1] * b[1][j]) % MOD
return c
def matrix_pow(a: List[List[int]], n: int) -> List[List[int]]:
ret = [[1, 0], [0, 1]]
while n > 0:
if n & 1:
ret = multiply(ret, a)
n >>= 1
a = multiply(a, a)
return ret
res = matrix_pow([[1, 1], [1, 0]], n - 1)
return res[0][0]