1、题目描述
斐波那契数,通常用 F(n)
表示,形成的序列称为 斐波那契数列 。该数列由 0
和 1
开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1
给你 n
,请计算 F(n)
。
2、算法分析
可以说,这是一道经典的题目,可以用递归做,但是这次我们使用DP来解。、
DP分为5个步骤:
①确定dp数组以及下标的含义。
本题dp数组的定义为:第i个数组斐波那契的值dp[i]
②确定递归公式。
题目已经给我们了dp[i] = dp[i-1] + dp[i-2];
③dp数组如何初始化。
dp[0] = 0;dp[1] = 1
④确定遍历顺序。
从递归公式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
3、代码实现
class Solution {
public int fib(int n) {
if(n < 2){
return n;
}
// 数组下标0...n: n+1
// 数组下标0...n-1: n
int[] dp = new int[n+1];
// 初始化数组
dp[0] = 0;
dp[1] = 1;
// 遍历地推公式
for(int index = 2;index < dp.length;index++){
dp[index] = dp[index - 1] + dp[index - 2];
}
// 返回数组的值
return dp[n];
}
}
当然,递归也可以
class Solution {
public int fib(int n) {
if(n < 2){
return n;
}
return fib(n-1) + fib(n-2);
}
}