剑指Offer10-I.斐波那契数列 C++

1、题目描述

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1
输入:n = 2
输出:1
示例 2:
输入:n = 5
输出:5

2、VS2019上运行

代码随想录的五步曲

#include 
#include 

class Solution {
public:
    int fib(int N) {
        if (N <= 1) return N;
        std::vector<int> dp(N + 1); // 创建一个长度为 N+1 的动态数组 dp
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= N; i++) {
            dp[i] = dp[i - 1] + dp[i - 2]; // 计算斐波那契数列第 i 项的值
        }
        return dp[N]; // 返回斐波那契数列第 N 项的值
    }
};

int main() {
    int N = 5;
    Solution s;
    int result = s.fib(N); // 调用 fib 方法计算斐波那契数列第 N 项的值
    std::cout << "Fibonacci number at position " << N << " is: " << result << std::endl;
    return 0;
}

运行结果:
Fibonacci number at position 5 is: 5
(这里出问题了,N=45时就出现错误,这是因为对于斐波那契数列,随着 n 的增加,数列的值增长非常迅速。当使用普通的整数类型(如 int 或 long long)进行计算时,这些类型的取值范围是有限的,无法容纳较大的斐波那契数列项。)

换官方题解

#include 

class Solution {
public:
    int fib(int n) {
        int MOD = 1000000007;  // 定义一个常量 MOD,用于取模运算
        if (n < 2) {
            return n;  // 如果 n 小于 2,直接返回 n 的值,因为斐波那契数列的前两项是 0 和 1
        }
        int p = 0, q = 0, r = 1;  // 初始化前两项和当前项的值
        for (int i = 2; i <= n; ++i) {
            p = q;  // 将 q 的值赋给 p,保留前一个项的值
            q = r;  // 将 r 的值赋给 q,更新当前项的值
            r = (p + q) % MOD;  // 计算下一项的值,并对 MOD 取模以避免溢出
        }
        return r;  // 返回斐波那契数列第 n 项的值
    }
};

int main() {
    int N = 10;
    Solution s;  // 创建 Solution 类的对象
    int result = s.fib(N);  // 调用 fib 方法计算斐波那契数列第 N 项的值
    std::cout << "Fibonacci number at position " << N << " is: " << result << std::endl;
    return 0;
}

运行结果:
Fibonacci number at position 10 is: 55

3、代码随想录解题思路

代码随想录的动态规划五步曲

  • 1、确定dp数组(dp table)以及下标的含义
  • 2、确定递推公式
  • 3、dp数组如何初始化
  • 4、确定遍历顺序
  • 5、举例推导dp数组

4、官方题解解题思路

  • 1.首先,我们定义了一个类 Solution,其中包含一个名为 fib 的方法,用于计算斐波那契数列的第 N 项的值。
  • 2.在 fib 方法中,我们首先定义了一个常量 MOD,用于进行取模运算。这个常量的值是 1000000007,是为了在计算过程中避免溢出。
  • 3.接下来,我们使用一个条件语句判断给定的 n 是否小于 2。如果是,则直接返回 n 的值,因为斐波那契数列的前两项是 0 和 1,所以它们的值与 n 相等。
  • 4.然后,我们初始化三个变量 p、q 和 r 分别为 0、0 和 1。这些变量分别表示当前项、前一项和下一项的值。
  • 5.进入循环,从索引 2 开始,直到 n。在每次循环中,我们更新变量的值:将 q 的值赋给 p,r 的值赋给 q,并计算 (p + q) % MOD 的结果并赋给 r。这样就实现了逐步计算斐波那契数列的下一项的值。
  • 6.循环结束后,我们返回变量 r 的值作为斐波那契数列的第 N 项的结果。

你可能感兴趣的:(剑指Offer刷题,c++,动态规划,算法,力扣)