力扣 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)
。
示例 1:
输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
考查知识点
动态规划
自己的第一遍解法
首先,这道题在剑指上也做过,但是剑指上采用的思想是用循环的方法,降低了空间复杂度,就是变量更新的时候需要注意谁先谁后
在看过【动规五步法】以后再来看这道题就比较显而易见了,从动态规划的角度来说,这就是一道入门题。
在动态规划(一)基本概念中讲到了,动态规划的题目都是从上到下分析问题,从下到上解决问题,体现在这里是什么呢,就是计算f(n)
会用到f(n-1)
和f(n-2)
,那么在计算f(n-1)
的时候还会用到f(n-2)
,因此这就是小问题之间包含着重叠的更小问题。针对这种现象,就不能从上到下先算f(n)
,再算f(n-1)
、f(n-2)
,必须先算f(n-2)
,再算f(n-1)
,最后算f(n)
,这就是从下到上解决问题。
按照动规五步法来分析:
1、确定dp数组(dp table)以及下标的含义
dp数组来保存f(n)
,这里dp数组的长度可以是n(最后直接返回dp[n]
),也可以是n-1(最后返回dp[n-1]+dp[n-2]
)
2、确定递推公式
这里是题目直接给出的
3、dp数组如何初始化
也是题目给出,dp[0]=0
,dp[1]=1
4、确定遍历顺序
这就是我们上面说的从下到上解决问题,不能从上到下先算f(n)
,再算f(n-1)
、f(n-2)
,必须先算f(n-2)
,再算f(n-1)
,最后算f(n)
5、举例推导dp数组
比如说n=4时,dp数组应该是下面这样
i 0 1 2 3 4
dp[i] 0 1 1 2 3
完整代码如下:
class Solution {
public:
int fib(int n) {
if (n == 0 or n == 1)
return n;
vector<int> dp(n, 0);
dp[1] = 1;
for (int i = 2; i < n; ++i) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n-1] + dp[n-2];
}
};
参考:
动态规划:斐波那契数https://mp.weixin.qq.com/s/ko0zLJplF7n_4TysnPOa_w