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

二、解题思路

斐波那契数列的求解可以通过多种方法,包括递归、动态规划和迭代。以下是几种常见的解题思路:

  1. 递归方法:直接根据斐波那契数列的定义进行递归计算,但这种方法的时间复杂度较高,为O(2^n),因为存在大量的重复计算。

  2. 动态规划:使用一个数组来存储已经计算过的斐波那契数,避免重复计算,时间复杂度降低到O(n)。

  3. 迭代方法:只使用常数空间,通过迭代的方式计算斐波那契数,时间复杂度同样为O(n)。

三、具体代码

class Solution {
    public int fib(int n) {
        // 如果n为0或1,直接返回n
        if (n <= 1) {
            return n;
        }
        
        // 初始化前两个斐波那契数
        int prev = 0;
        int curr = 1;
        
        // 迭代计算斐波那契数
        for (int i = 2; i <= n; i++) {
            int sum = prev + curr; // 计算下一个斐波那契数
            prev = curr;           // 更新前一个斐波那契数
            curr = sum;            // 更新当前斐波那契数
        }
        
        // 返回第n个斐波那契数
        return curr;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度

在上述代码中,我们有一个for循环,该循环从2迭代到n。在每次迭代中,我们执行一系列的固定操作(加法、赋值),这些操作的执行时间与n的大小无关,都是常数时间操作。因此,循环的时间复杂度是O(n),因为循环体执行了n-1次。

综上所述,该算法的时间复杂度是O(n)。

2. 空间复杂度

在上述代码中,我们使用了几个变量:n(输入参数),prevcurrsum。这些变量在计算过程中始终保持不变的大小,不依赖于输入n的大小。因此,它们占用的空间是常数空间。

由于没有使用额外的数据结构(如数组或哈希表)来存储中间结果,且没有递归调用(递归调用会使用调用栈空间),算法的空间复杂度是O(1)。

五、总结知识点

  • 基本控制结构

    • if 语句:用于检查基本条件,判断n是否小于或等于1。
    • for 循环:用于迭代计算斐波那契数列中的每一项。
  • 变量声明与初始化

    • 变量prevcurr被声明并初始化为斐波那契数列的前两个数。
  • 算术运算

    • 加法运算符+:用于计算斐波那契数列中下一个数的值。
  • 赋值操作

    • 赋值语句=:用于更新变量prevcurr的值。
  • 方法定义

    • public关键字:表示方法可以被类外部访问。
    • int类型:表示方法返回值类型为整数。
    • 方法名fib:遵循Java命名习惯,通常使用小写字母开头。
    • 参数列表(int n):表示方法接受一个整数类型的参数n
  • 递推关系

    • 斐波那契数列的计算使用了递推关系,即每个数是前两个数的和。
  • 算法逻辑

    • 代码实现了迭代算法来计算斐波那契数列,这是一种高效计算斐波那契数的方法,避免了递归算法中的大量重复计算。
  • 返回值

    • return语句:用于结束方法执行并返回计算结果。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一直学习永不止步

谢谢您的鼓励,我会再接再厉的!

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

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

打赏作者

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

抵扣说明:

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

余额充值