当前位置: 首页 > news >正文

LeetCode_LCR 509 斐波拉契

斐波那契数:从递归到动态规划的优化之旅

问题描述

斐波那契数列以 F(0) = 0F(1) = 1 开始,后续每一项都是前两项之和。给定整数 n,要求计算 F(n)

示例

  • n = 2 → 输出 1F(2) = F(1) + F(0) = 1 + 0
  • n = 3 → 输出 2F(3) = F(2) + F(1) = 1 + 1
  • n = 4 → 输出 3F(4) = F(3) + F(2) = 2 + 1

约束0 ≤ n ≤ 30


解法分析

斐波那契数列是经典的递归问题,但直接递归会导致大量重复计算。以下是逐步优化的解法:

1. 递归解法(不推荐)

直接递归是最直观的解法,但时间复杂度为指数级( O ( 2 n ) O(2^n) O(2n)),在 n 较大时效率极低。

public int fib(int n) {if (n == 0) return 0;if (n == 1) return 1;return fib(n - 1) + fib(n - 2);
}
2. 记忆化搜索(自顶向下)

通过缓存已计算结果避免重复计算,时间复杂度优化为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)(递归栈空间 + 缓存数组)。

代码实现

class Solution {int[] arr = new int[31]; // 缓存数组,n最大为30public int fib(int n) {return f(n);}private int f(int n) {if (n == 0) return 0;if (n == 1) return 1;if (arr[n] != 0) return arr[n]; // 命中缓存arr[n] = f(n - 1) + f(n - 2); // 计算并缓存return arr[n];}
}

关键点

  • 初始化缓存数组:大小为 31n 最大为 30)。
  • 递归终止条件n = 0n = 1 时直接返回。
  • 缓存查询:优先检查缓存,避免重复计算。
3. 动态规划(自底向上)

迭代代替递归,消除递归栈开销。时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)(仅需缓存数组)。

代码实现

class Solution {public int fib(int n) {if (n <= 1) return n;int[] dp = new int[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];}
}
4. 空间优化动态规划

只保留最近两个状态,空间复杂度优化至 O ( 1 ) O(1) O(1)

class Solution {public int fib(int n) {if (n <= 1) return n;int a = 0, b = 1;for (int i = 2; i <= n; i++) {int c = a + b;a = b;b = c;}return b;}
}

总结

方法时间复杂度空间复杂度适用场景
直接递归 O ( 2 n ) O(2^n) O(2n) O ( n ) O(n) O(n)仅限极小的 n
记忆化搜索 O ( n ) O(n) O(n) O ( n ) O(n) O(n)通用,但递归有栈开销
动态规划 O ( n ) O(n) O(n) O ( n ) O(n) O(n)无栈溢出风险
优化动态规划 O ( n ) O(n) O(n) O ( 1 ) O(1) O(1)最优解,推荐使用

关键优化思想

  • 避免重复计算:通过缓存中间结果(记忆化或动态规划)。
  • 空间压缩:仅保留必要的前两个状态,将空间复杂度降至常数级。

面试提示:面试中通常要求从递归思路开始,逐步优化到动态规划,最后给出空间优化版本。务必强调避免重复计算的重要性!

http://www.xdnf.cn/news/891451.html

相关文章:

  • 经济学顶刊QJE:构建从非结构化文本数据中挖掘经济规律的新框架!
  • 【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)
  • 实测报告:设备 AI 知识库如何帮助新手快速掌握巡检技巧?
  • 在嵌入式中C语言中static修饰的变量常量和字符串常量存储位置
  • 总结vxe-grid的一些用法
  • 精度分析方法-不确定度
  • [蓝桥杯]三体攻击
  • MySQL的并发事务问题及事务隔离级别
  • 12V降5V12A大功率WD5030A,充电器、便携式设备、网络及工业领域的理想选择
  • 大语言模型评测体系全解析(中篇):专项能力评测与行业垂直场景
  • Mysql莫名奇妙重启
  • 实现单例模式的常见方式
  • Redis Set集合命令、内部编码及应用场景(详细)
  • GC1809:高性能音频接收与转换芯片
  • Python Day42 学习(日志Day9复习)
  • AI智能推荐实战之RunnableParallel并行链
  • .Net Framework 4/C# System.IO 命名空间(文件的输入输出)
  • 深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(2)
  • 箭头函数和普通函数的this指向
  • BLE中心与外围设备MTU协商过程详解
  • 炫云:为驱动数字视觉产业升级保驾护航
  • 【设计模式-4.11】行为型——解释器模式
  • centos实现SSH远程登录
  • 分布式一致性原理及一致性协议
  • AI数字人小程序开发,重塑商业服务新模式
  • 6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器
  • 分析vban的utlis中的helper方法(1)——数组
  • 【技术笔记】AI Agent 项目 SUNA 部署:MSYS2 环境中 Python 版本从 3.12 降级至 3.11 的实操指南
  • place 布局管理器
  • java使用文本相似度检测可以调整阈值