Leetcode 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:

输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

  • 0 <= n <= 30

通过次数

624K

提交次数

946.3K

通过率

65.9%

一、信息

其实这道题目和上一道爬楼梯很像,就是边界值不同,都是用动态规划和滚动数组就可以解决。

斐波那契数列问题要求计算 F(n),其中 F(0) = 0, F(1) = 1,并且对于任何 n > 1, F(n) = F(n - 1) + F(n - 2)。

二、分析

  • 数列定义:斐波那契数列是一个经典的递归数列,每个数是前两个数之和。
  • 递归与迭代:直接递归会导致重复计算,效率低。迭代可以有效避免重复计算。
  • 动态规划思想:存储前两个数的值,避免重复计算,这是动态规划的基本思想。

三、算法设计

  • 迭代计算:从 0 和 1 开始,逐步计算直到第 n 个数。
  • 存储中间值:使用变量存储前两个数。
  • 边界情况:如果 n 是 0 或 1,直接返回 n。

四、代码实现(C++)

class Solution {
public:
    int fib(int n) {
        int p=0,q=0,r=1;
        if(n==0) return 0;
        else{
            for(int i=1;i<n;i++){
                p=q;
                q=r;
                r=p+q;
            }
        }
        return r;
    }
};

五、实现代码过程中可能遇到的问题

  • 边界条件处理:必须正确处理 n = 0 和 n = 1 的情况。
  • 整型溢出:对于更大的 n,可能会发生整型溢出。在本题中 n 的最大值是 30,不会发生溢出。
  • 递归与迭代选择:直接递归虽然简单,但效率低。迭代是更优选择。

六、和爬楼梯的异同

相同点

  • 递推关系:两者都具有递推关系,即当前值依赖于前几个值的和。
  • 动态规划适用性:都可以使用动态规划的思想来优化计算过程,避免重复计算。

不同点

  • 问题背景:斐波那契数列是一个数学问题,而爬楼梯问题是一个实际应用问题。
  • 边界条件:斐波那契数列的起始值是 0 和 1,而爬楼梯问题的起始是 1 和 2(如果看作是斐波那契数列的变种)。
  • 递推公式:虽然两者都是基于之前两个数的和,但爬楼梯问题在 n = 1 时的处理略有不同。

总结:

从斐波那契数列的问题中,我们可以学到许多重要的编程和算法概念,以及它们如何应用于解决不同类型的问题。以下是一些关键的学习点和思考角度:

1. 递归与迭代的理解和应用

  • 递归思维:斐波那契数列天然适合递归解法,因为每个元素都是前两个元素的和,这符合递归的特性。
  • 迭代的效率:虽然递归直观,但在实际应用中,迭代方法更加高效,因为它避免了递归带来的重复计算和高内存消耗。

2. 动态规划的基础概念

  • 重叠子问题:斐波那契数列问题中的每个子问题都是重叠的,即每个数的计算都依赖于前面计算过的数。
  • 记忆化:通过存储已解决的子问题的答案,可以减少计算量,这是动态规划中“记忆化”技术的基础。

3. 算法优化

  • 空间优化:使用滚动数组的思想可以将空间复杂度降低到 O(1),这种技巧在许多动态规划问题中都非常有用。

4. 算法通用性和问题转换

  • 问题转换:将现实问题(如爬楼梯问题)转化为数学问题(斐波那契数列),再找到算法解决方案。
  • 算法复用:学会在不同的问题中识别相似的模式,并复用相同的算法思想。例如,斐波那契数列和爬楼梯问题在算法结构上有相似之处。

5. 算法和数学的结合

  • 数学模型的构建:算法不仅是编程技巧,也是一种将问题抽象为数学模型的工具,然后使用数学方法解决问题。

6. 边界情况的处理

  • 边界条件:在解决任何算法问题时,始终注意边界条件的处理,这对于实现正确的算法至关重要。

通过这样的问题,我们不仅学习了如何编写有效的代码来解决特定问题,还能够深入理解和应用一些核心的计算机科学和数学概念,这对于解决更复杂的问题和长期的技术成长非常有价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值