0%

LeetCode-509-斐波那契数

LeetCode 509 斐波那契数

509.斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n)

动态规划

此处已经给定了相应的状态转移方程,当前的决策是和前两个状态相关的,那么就需要从前向后递推。使用动态规划求解的步骤如下:

动规五部曲:

这里我们要用一个一维dp数组来保存递归的结果

1.确定dp数组以及下标的含义

dp[i] 的定义为:第i个数的斐波那契数值是 dp[i] 由于在计算时只需要使用到前两个状态,那么在就只需要保存前两个序列即可。

2.确定递推公式

状态转移方程 dp[i] = dp[i - 1] + dp[i - 2] ;

3.dp数组如何初始化

1
2
dp[0] = 0;
dp[1] = 1;

4.确定遍历顺序

从递归公式 dp[i] = dp[i - 1] + dp[i - 2] ;中可以看出,dp[i] 是依赖 dp[i - 1]dp[i - 2] ,那么遍历的顺序一定是从前到后遍历的

5.举例推导dp数组

按照这个递推公式 dp[i] = dp[i - 1] + dp[i - 2] ,我们来推导一下,当N为10的时候,dp 数组应该是如下的数列:

0 1 1 2 3 5 8 13 21 34 55

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int fib(int n) {
if(n<2) return n==0?0:1;
int dp[3];
dp[0]=0;
dp[1]=1;
for(int i=2;i<=n;i++){
dp[2]=dp[0]+dp[1];
dp[0]=dp[1];
dp[1]=dp[2];
}
return dp[2];
}
};
-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道