LeetCode 斐波那契数列
题目描述
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
解法
1、递归法(太耗时,知道,会写,不推荐)
# include <iostream>
#include<time.h>
using namespace std;
int fib(int n)
{
if (n == 0) return 0;
else if (n == 1) return 1;
else
return (fib(n - 1) + fib(n - 2)) % 1000000007;
}
int main()
{
//1、 recusive
clock_t start, ends;
start = clock();
int n,res;
cin >> n;
int fib(int); // 规范化还是加上
res = fib(n);
cout << res;
ends = clock();
cout << ends - start << endl;
return 0;
}
、
2、记忆化递归
原理: 在递归法的基础上,新建一个长度为 nn 的数组,用于在递归时存储 f(0)f(0) 至 f(n)f(n) 的数字值,重复遇到某数字时则直接从数组取用,避免了重复的递归计算。
缺点: 记忆化存储的数组需要使用 O(N)O(N) 的额外空间
3、
由于 dpdp 列表第 ii 项只与第 i-1i−1 和第 i-2i−2 项有关,因此只需要初始化三个整形变量 sum, a, b ,利用辅助变量 sum 使 a, b 两数字交替前进即可
int n;
cin >> n;
start = clock();
//int a, b = 0, 1;
int a = 0, b = 1;
for (int i = 0; i <= n; i++)
a, b = b, a + b;
cout << a % 1000000007;
class Solution:
def fib(self, n: int) -> int:
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a % 1000000007
注意返回是 a % 1000000007,,不是 b % 1000000007
手推下,就知道了
4、DP方法
class Solution:
def fib(self, n: int) -> int:
# DP
if n == 0: return 0
elif n==1 : return 1
else:
dp = []
dp.append(0)
dp.append(1)
for i in range(2,n+1):
dp_m = dp[i-1] + dp[i-2]
dp_m = dp_m % 1000000007
dp.append(dp_m)
return dp[-1]