001.斐波那契数

1.题目链接:

509. 斐波那契数

2.解题思路:

2.1.题目要求:

给一个 N ,要求返回 N 对应 F(N)的值

F是斐波那契数列,其初始值F(0) = 1,F(1) = 1,然后后面每一项数字值都是前面两项值之和。

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

例子:N = 2, F(2) = F(0) + F(1) = 2

2.2.思路:

利用for循环,从 2 开始(开始有规律),不断向前递推到 N ,由上一步的值求出下一步的值,直到 目标F(N) 结束。  

2.3.动规五部曲:

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

dp[ i ] 意思是第 i 个斐波那契数列的值。

2.3.2.确定递推公式

题目给我们了,

F(n) = F(n - 1) + F(n - 2)

2.3.3.dp数组如何初始化

初始化也给了

F( 0 ) = 0 , F(1)  = 1

2.3.4.确定遍历顺序

从斐波那契数列的推导公式来看,要求dp[ i ] 需要一步步往前推来得出,所以顺序是从前到后。

2.3.5.举例推导dp数组(debug测试)

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

0 1 1 2 3 5 8 13 21 34 55

如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是一致的。

2.3.6.注意事项

1.当输入的N <= 1 的时候,直接返回N就好

2.4.总代码:

2.4.1.第一版

class Solution {
public:
    int fib(int N) {//是一个函数,输入参数和返回类型都是int类型
        if (N <= 1) return N;
        vector dp(N + 1);//定义一个容器,容器空间为N+1
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= N; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[N];
    }
};

2.4.1.精简版

(这样省去很多空间,不用定义容器)

class Solution {
public:
    int fib(int N) {
        if (N <= 1) return N;
        int dp[2];// 定义一个数组
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= N; i++) {
            int sum = dp[0] + dp[1];
            dp[0] = dp[1];
            dp[1] = sum;
        }
        return dp[1];
    }
};

3.遇见的问题:

4.记录:

第一题!在家好难学啊,不过还是开始了第一步,身体好虚,要去运动一下了,各种瘾癖也要戒了。

你可能感兴趣的:(动态规划——代码随想录,算法)