力扣 509 斐波那契数【动态规划】

力扣 509 斐波那契数

全部刷题与学习记录

【C++刷题学习笔记目录】

【C++百万并发网络通信-笔记目录】

原题目

题目地址:509. 斐波那契数

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

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

考查知识点

动态规划


自己的第一遍解法

首先,这道题在剑指上也做过,但是剑指上采用的思想是用循环的方法,降低了空间复杂度,就是变量更新的时候需要注意谁先谁后

剑指 10 斐波那契数列

在看过【动规五步法】以后再来看这道题就比较显而易见了,从动态规划的角度来说,这就是一道入门题。

动态规划(一)基本概念中讲到了,动态规划的题目都是从上到下分析问题,从下到上解决问题,体现在这里是什么呢,就是计算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]=0dp[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

猜你喜欢

转载自blog.csdn.net/weixin_44484715/article/details/113957670