斐波那契数列
题目说明:
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
- F(0) = 0, F(1) = 1
- F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),防止内存溢出
示例 1:
输入:n = 2 输出:1
示例 2:
输入:n = 5 输出:5
思路一:递归调用
这种方法的时间复杂度为 O ( N 2 ) O(N^2) O(N2) 基本可以舍弃这种方法,一但 N>35 左右,这运行的时间就会让你受不了。这种写法如下:
cpp:
class Solution {
public:
int fib(int n) {
if(n < 2 ){
return n;
}
else{
return fib(n-2) + fib(n-1);
}
}
};
pyhton:
class Solution:
def fib(self, n: int) -> int:
if n<2 :
return n
else:
return fib(n-2) + fib(n-1)
思路二:动态规划
我们每次都将前一次计算的结果保留,这样就避免了重复计算
方法一: 采用数组保存之前的每一个计算结果,时间复杂度为 O ( N ) O(N) O(N),空间复杂度 O ( N ) O(N) O(N)
代码:
cpp:
class Solution{
public:
int fib(int n){
if (n < 2){
return n ;
}
else{
vector<int> list;
list.push_back(0);
list.push_back(1);
for(int i =2; i<=n; i++){
list.push_back((list[i-1]+list[i-2] ) % (int)(1e9 + 7)) ;
}
return list[n];
}
}
};
python:
class Solution:
def fib(self, n: int) -> int:
list_data = [0, 1]
if n<2 :
return n
for i in range(2, n+1):
list_data.append((list_data[i-2]+list_data[i-1]) % (1000000007))
return list_data[n]
方法二: 我们对空间存储进行优化,不采用数组保存之前的每一个计算结果,而是使用两个变量保存最近的两个结果,时间复杂度为 O ( N ) O(N) O(N),空间复杂度 O ( 1 ) O(1) O(1)
cpp:
class Solution{
public:
int fib(int n){
int a = 0,b = 1;
for (int i = 0; i<n; i++){
int temp;
temp = a % (int)(1e9 + 7);
a = b % (int)(1e9 + 7);
b = (temp+b) % (int)(1e9 + 7);
}
return a;
}
};
python:
class Solution:
def fib(self, n: int) -> int:
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a % 1000000007