难度简单162收藏分享切换为英文接收动态反馈
写一个函数,输入 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。
示例 1:
输入:n = 2
输出:1
示例 2:
输入:n = 5
输出:5
提示:
0 <= n <= 100
----------------------------分割线------------------------------
看到斐波那契数列,狂喜,递归,一顿操作猛如虎,提交之后被教做人。
int fib(int n){
//1. 递归
if(n==0)
return 0;
if(n==1)
return 1;
// (A+B) Mod C = ((A Mod C)+(B Mod C)) Mod C;
return (fib(n-1)%MOD + fib(n-2)%MOD) % MOD;
}
不能用递归的方式,用递归的方式多次嵌套会报超时!!
只能用动态规划的方法,以空间换时间。(动态规划类似高中的数学归纳法)
1. 创建数组储存各种结果 此处是dp[101]
2. 根据题意,把已知的前几种dp写出来, 此处是 dp[0]=0; dp[1] = 1;
3. 状态改变的方程 因变量 = f(自变量) 此处是 dp[n] = dp[n-1] + dp[n-2];
4. 将所有dp算出来 此处对应的是 for(i=2;i<=n;i++)
5.返回最终结果 此处是 dp[n]
还有一个坑,就是算到90+以上是,int / long型和long long型,
dp[n] = dp[n-1] + dp[n-2];都会溢出,题目要求最终答案要模上 1e9+7
想起以前的一条公式
(A+B)Mod C = ((A Mod C) + (B Mod C)) Mod C
不用死级,想一组数即可
(3+4) Mod 7 = 0
还有转化后的
((3 Mod 7) + (4 Mod 7)) Mod 7 = 0
后续看见题目说结果模上一个数,大概率就是提示我们,数值相加或相乘会溢出,可以想起这公式
提交代码如下
int fib(int n){
int i;
int dp[101];
const int mod = 1000000007;
dp[0]=0;
dp[1]=1;
for(i=2;i<=n;i++){
dp[i] = ((dp[i-1])%mod + (dp[i-2])%mod)%mod;
}
return dp[n];
}
20210904 重刷
#define MOD (1000000007)
int fib(int n){
int i;
int result[101] = {0};
//2. 动态规划
result[0] = 0;
result[1] = 1;
for(i=2;i<=n;i++){
result[i]=((result[i-1]%MOD) + (result[i-2]% MOD))% MOD;
}
return result[n];
}