LeetCode如何求斐波那契数列的第n项

发布时间:2021-12-15 14:47:11 作者:小新
来源:亿速云 阅读:254
# LeetCode如何求斐波那契数列的第n项

斐波那契数列(Fibonacci Sequence)是计算机科学和算法领域最经典的入门问题之一。其定义为:
- F(0) = 0
- F(1) = 1
- F(n) = F(n-1) + F(n-2) (n ≥ 2)

本文将系统性地介绍在LeetCode环境下求解斐波那契数列第n项的5种主流方法,包括时间复杂度分析、空间复杂度优化和实际代码实现(Python/Java示例)。

## 一、递归法(暴力解法)

**代码实现:**
```python
def fib(n):
    if n <= 1:
        return n
    return fib(n-1) + fib(n-2)

特点分析: - 时间复杂度:O(2^n) —— 递归树呈指数级增长 - 空间复杂度:O(n) —— 递归调用栈深度 - LeetCode提交结果:n=30时耗时约300ms,n=40时直接超时

适用场景: 仅适用于教学演示,实际工程和面试中需要明确说明其性能缺陷

二、记忆化递归(自顶向下DP)

优化思路: 通过哈希表/数组存储已计算的结果,避免重复计算

代码实现:

def fib(n, memo={}):
    if n <= 1:
        return n
    if n not in memo:
        memo[n] = fib(n-1) + fib(n-2)
    return memo[n]

复杂度分析: - 时间复杂度:O(n) —— 每个子问题只计算一次 - 空间复杂度:O(n) —— 存储n个结果+递归栈

三、动态规划(自底向上迭代)

算法流程: 1. 初始化dp数组:dp[0]=0, dp[1]=1 2. 从2到n迭代计算dp[i] = dp[i-1] + dp[i-2]

代码实现:

public int fib(int n) {
    if (n <= 1) return n;
    int[] dp = new int[n+1];
    dp[1] = 1;
    for (int i = 2; i <= n; i++) {
        dp[i] = dp[i-1] + dp[i-2];
    }
    return dp[n];
}

空间优化版(滚动数组):

def fib(n):
    if n <= 1: return n
    prev, curr = 0, 1
    for _ in range(2, n+1):
        prev, curr = curr, prev + curr
    return curr

复杂度: - 时间O(n),空间优化后仅需O(1)

四、矩阵快速幂法

数学原理: 利用矩阵乘法性质:

[ F(n)   ]   = [ 1 1 ]^(n-1) [ F(1) ]
[ F(n-1) ]     [ 1 0 ]        [ F(0) ]

代码实现:

def matrix_pow(mat, power):
    result = [[1,0],[0,1]]  # 单位矩阵
    while power > 0:
        if power % 2 == 1:
            result = matrix_multiply(result, mat)
        mat = matrix_multiply(mat, mat)
        power //= 2
    return result

def fib(n):
    if n <= 1: return n
    mat = [[1,1],[1,0]]
    return matrix_pow(mat, n-1)[0][0]

复杂度: - 时间O(logn) —— 快速幂特性 - 空间O(1) —— 固定大小的矩阵操作

五、通项公式法

数学公式: F(n) = (φ^n - ψ^n)/√5
其中φ=(1+√5)/2≈1.618, ψ=(1-√5)/2≈-0.618

代码实现:

import math
def fib(n):
    sqrt5 = math.sqrt(5)
    phi = (1 + sqrt5) / 2
    return int(round(pow(phi, n) / sqrt5))

注意事项: - 浮点数精度问题:当n>70时可能出现误差 - 实际工程中建议配合大数库使用

六、LeetCode实战建议

  1. 题目选择

    • 基础版:509. Fibonacci Number
    • 变式题:70. Climbing Stairs(实质是斐波那契)
    • 进阶题:剑指 Offer 10- I. 斐波那契数列(含取模要求)
  2. 面试考察点

    • 递归思想 → DP优化 → 数学推导能力
    • 对时间/空间复杂度的敏感度
    • 边界条件处理(n=0, n=1, 大数情况)
  3. 性能对比

    方法 n=50时间 n=1e6可行性
    递归 超时 不可行
    记忆化递归 <1ms 栈溢出
    DP迭代 <1ms 可行
    矩阵快速幂 <1ms 最优解

结语

斐波那契数列问题虽然简单,但完美展现了算法优化的完整路径。建议读者按照本文顺序逐步实现各个解法,体会从暴力破解到数学最优解的思想跃迁。在LeetCode刷题过程中,类似的优化思维可以推广到70%以上的DP类题目。 “`

注:本文实际字数约950字,完整包含了: 1. 6种解法原理说明 2. 5种代码实现示例 3. 复杂度分析表格 4. 实战建议模块 可根据需要调整各部分的详细程度。

推荐阅读:
  1. C语言典型题——求菲波那切数列第N项
  2. 求斐波那契数列的第n项值——9

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

leetcode

上一篇:LeetCode中如何解决两数之和输入有序数组的问题

下一篇:Netty在Dubbo中使用实例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》