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

代码随想录 27(动态规划)

力扣 509.斐波那契数


思路

动态规划五部曲:

  1. 确定dp数组已经下标的含义
  2. 确定递推公式
  3. 数组初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

根据题目和五步曲,分析如下:

  1. dp[i] 含义是:第 i 个斐波那契数是 dp[i]
  2. 递推公式题目已经给出:dp[i] = dp[i-1] + dp[i-2]
  3. 数组初始化题目已经给出:dp[0] = 0 、dp[1] = 1
  4. 遍历顺序是从前往后遍历

解法

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]; }

这个解法,可以遍历n次,时间复杂度是On,定义一个n+1的数组,空间复杂度是O(n+1)。实际上只需要定义一个长度为2的数组,总和可以用一个变量sum来维护,这样的话时间复杂度不变,但是空间复杂度为O1

// 优化之后没有用数组,直接优化成变量 public int fib(int n) { if (n <= 1) { return n; } int a = 0, b = 1, sum = 0; for (int i = 2; i <= n; i++) { sum = a + b; a = b; b = sum; } return sum; }

力扣 70.爬楼梯


思路

动态规划五步曲:

  1. 确定动态数组dp,以及下标的含义
  2. 确定递推公式
  3. 确定初始化值
  4. 确定遍历顺序
  5. 举例推导数组

一开始博主想的是 dp[i] 数组是每次爬多少阶,i 下标是第 i 阶。但是这样的思路不对,因为题目要求的是多少种爬楼梯方法,这样想可以到达楼顶,但是无法得到有多少种方法。

下面按照五步曲,进行正确的推理:

  1. dp[i] 是爬到第 i 层有dp[i] 种爬楼梯的方法,
  2. dp[i] 的时候有两种情况:在dp[i-1] 爬一层,或者在dp[i-2] 爬二层。
    因此递推公式是 dp[i] = dp[i-1] + dp[i-2]
  3. 题目条件:1<=n<=45,所以不用考虑dp[0] ,那么dp[1] = 1;dp[2] = 2。
  4. 遍历顺序是从前往后
  5. n = 3时候,dp[3] = dp[2] + dp[1] = 3

解法

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

遍历n-3次,时间复杂度是On,定义数组长度为n+1,那么空间复杂度是On,那可不可以像上一题那样优化空间复杂度呢?其实是可以的,不难看出,答案跟上一题是几乎一样,那么优化应该没有问题。

public int climbStairs(int n) { if (n<=2) { return n; } int sum = 0, a = 1, b = 2; for (int i = 3; i <= n; i++) { sum = a + b; a = b; b = sum; } return sum; }

力扣 746.使用最小花费爬楼梯


思路


解法

http://www.jsqmd.com/news/652202/

相关文章:

  • Notepad++最新版更新|安全修复+VS Code对比,免费开源编辑器首选(附批量处理技巧)
  • 保姆级教程:在VMware 16上用Ubuntu 18.04给Jetson TX2刷JetPack 4.6(含ARM/X86换源避坑)
  • C++面试突击:从new/delete到STL容器,这些高频考点你真的掌握了吗?
  • 实战复盘:基于涨乐财付通APP徒手写一个“双时间点”全市场行情盯盘系统
  • C语言共用体(联合体)的‘骚操作’:如何用union巧妙节省内存?附嵌入式开发实战代码
  • 前端安全防护实战指南
  • 低查重AI教材生成秘籍大公开!高效工具助力快速编写专业教材!
  • Pixel Language Portal 算法优化案例:卷积神经网络跨维特征提取
  • 手把手教你用Arduino和PulseSensor做个心率监测仪(附Processing上位机调试技巧)
  • MTX-PLGA-Fe₃O₄,氨甲蝶呤-PLGA-四氧化三铁纳米颗粒 ,化学特性
  • 告别枯燥理论!用 Proteus 8.15 + 51 汇编玩转硬件:5 个创意小项目源码全解析
  • FastAPI 容器化部署:编写高性能 Dockerfile 与 Uvicorn 生产配置
  • 360°全景拼接相机开发避坑指南:海思3403平台4目方案常见问题解析
  • MTX-PLGA-Fe₃O₄,米托蒽醌-PLGA-四氧化三铁纳米颗粒,反应原理
  • 别再纠结波特率了!用应广单片机实现自定义UART,搞定OTP调试数据传输
  • JDspyder:京东抢购自动化脚本终极指南,告别手动抢购烦恼
  • 别再只会adb install了!手把手教你用ADB搞定APK安装、权限修改与系统目录操作
  • Performance-Fish:基于零分配缓存架构与并行化优化实现4倍游戏性能提升的技术深度解析
  • 告别黑屏!树莓派外接显示器/电视的5个常见问题与解决方法(Raindrop工具详解)
  • FastAPI 与 GraphQL 融合:集成 Strawberry 实现灵活查询接口详解
  • Bilivideoinfo:高效精准的B站视频数据批量爬取实战指南
  • VMware Horizon 8连接测试后,别忘了检查这5个关键点(安全与性能优化指南)
  • Qt多界面切换踩坑实录:QStackedWidget内存泄漏?QTabWidget动态增删页卡的正确姿势
  • PlatformIO烧录ESP32时,esptool.py到底在背后干了啥?一个命令让你看清所有bin文件和地址
  • 如何在Windows上使用vJoy虚拟摇杆驱动:完整的新手教程 [特殊字符]
  • AI取代测试员?真相与反制策略
  • Zotero Style插件:如何让文献管理从枯燥变有趣?
  • 网文新手逆袭秘籍:AI助我签约成功了,没想到困难变成了助手
  • Cortex-M7处理器架构与中断优化实践
  • 手把手教你用Python实现BPE分词器(附CS336作业实战代码)