力扣509. 斐波那契数
题目来源(力扣):
https://leetcode.cn/problems/fibonacci-number/description/
题目描述:
已知斐波那契数列:0,1,1,2,3,5,……
即
a[i]=i,(i=0,1)
a[i]=a[i-1]+a[i-2] ,(i>1)
问第n个斐波那契数是多少(n从0开始)
0<=n<=30
基本思路:
动态规划人们级别题目,比背包问题更加简单,可以好好体会一下动态规划解决问题的代码实现流程。
参考《代码随想录》,一般需要结果五步来解决一个动态规划问题,能够保证规范和高效。
代码实现:
class Solution
{
public:
int fib(int n)
{
// 0.最好优先处理最特殊(例如n=0)的情况,避免难以察觉的bug
if (n == 0)
return 0;
if (n == 1)
return 1;
// 1.确定dp数组以及含义. dp[i] 表示第i个斐波那契数为dp[i]
vector<int> dp(n + 1); // 由于下标从0~n,所以数组大小至少为n+1
// 2.确定递推方程.
// dp[i]=dp[i-1]+dp[i-2],题目中给出了
// 3.初始化.
dp[0] = 0, dp[1] = 1;
// 4.确定遍历顺序.
// 由于dp[i]是根据dp[i-1]、dp[i-2]得来的,因此需要从前往后遍历
for (int i = 2; i <= n; i++)
dp[i] = dp[i - 1] + dp[i - 2];
// 5.打印部分序列. 用于确认dp数组和自己预设的一样(这里预设应该是[0,1,1,2,3,5,...])
// for(int i=0;i<dp.size();i++)
// cout<<dp[i]<<" ";
return dp[n];
}
};
时间复杂度
O(n)
浙公网安备 33010602011771号