一、题目描述
斐波那契数,通常用 F(n)
表示,形成的序列称为 斐波那契数列 。该数列由 0
和 1
开始,后面的每一项数字都是前面两项数字的和。也就是:
给你 n
,请计算 F(n)
。
提示:
0 <= n <= 30
二、解题思路
动态规划五部曲是从某个大佬的文档中学到的,专门用来求解动态规划的题目,很好用,后面有关动态规划的题目都将使用动规五部曲。
动态规划五部曲:
第一步:确定dp数组以及下标的含义
dp[i]的定义为:第i个数的斐波那契数值是dp[i]
第二步:确定递推公式
状态转移⽅程 dp[i] = dp[i - 1] + dp[i - 2];
第三步:dp数组初始化
dp[0] = 0;
dp[1] = 1;
当然代码中写的是如下,那么for循环中也要做小小的修改。
dp[1] = 1;
dp[2] = 1;
for(int i=2; i<=n; i++){
dp[i] = dp[i-1] + dp[i-2];
}
第四步:确定遍历顺序
从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序
⼀定是从前到后遍历的
第五步:举例推导dp数组
按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导⼀下,当N为10的时候,dp数组应该是如下的
数列:0 1 1 2 3 5 8 13 21 34 55
三、代码演示
class Solution {
public int fib(int n) {
if(n<2){
return n;
}
int[] dp = new int[n+1];
dp[1] = 1;
dp[2] = 1;
for(int i=3; i<=n; i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
}