【力扣一刷】代码随想录day38(动态规划part1:509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼)

本文主要是介绍【力扣一刷】代码随想录day38(动态规划part1:509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

【动态规划理论基础】

【509. 斐波那契数】简单题

方法一  用额外的数组存储每个状态

方法二  用2个遍历存储前两个状态(减小空间复杂度)

【70. 爬楼梯】简单题

【746. 使用最小花费爬楼】简单题


【动态规划理论基础】

1、定义:英文为Dynamic Programming,简称DP

2、步骤:

  • 确定变量 f(i) 的含义
  • 确定递推公式:如 f(i) 和 f(i-1)、f(i-2) 的关系,自变量的数量根据具体情况而定
  • 如何初始化
  • 确定遍历顺序
  • 举例推导dp数组


【509. 斐波那契数】简单题

方法一  用额外的数组存储每个状态

class Solution {public int fib(int n) {if (n <= 1) return n;int[] list = new int[n+1];list[0] = 0;list[1] = 1;for (int i = 2; i < n+1; i++){list[i] = list[i-1] + list[i-2];}return list[n];}
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

方法二  用2个遍历存储前两个状态(减小空间复杂度)

注意:for循环主要是控制计算的次数,初始值已经知道 f(0) 和 f(1) 的值了,计算从 f(2) 到 f(n) 的值,i 从2开始,直至n,共计算 n - 2 + 1 = n - 1 次。

class Solution {public int fib(int n) {if (n <= 1) return n;int x1 = 0;int x2 = 1;int y = 0;for (int i = 2; i < n+1; i++){y = x1 + x2;x1 = x2;x2 = y;}return y;}
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)


【70. 爬楼梯】简单题

思路:为 n = 1 和 n = 2 构造前面两个变量的值,使其都可以通过for循环计算

对于 n = 1,结果为1,对于 n = 2,结果为2,可以推出 n = 0,结果为 2 - 1 = 1。

对 n = 1 来说,除了 n = 0外还差一个 f(i-2)的值,可以初始化为 1 - 1 = 0。

class Solution {public int climbStairs(int n) {int x1 = 0;int x2 = 1;int y = 0;for (int i = 1; i <= n; i++){y = x1 + x2;x1 = x2;x2 = y;}return y;}
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)


【746. 使用最小花费爬楼】简单题

思路:

1、分别计算从第 i 阶起跳至少要花费的钱。

2、楼顶肯定是第 cost.length - 1 阶或者第 cost.length - 2 阶楼梯起跳跳上去的,所以返回这两个之中的最小值即可。

class Solution {public int minCostClimbingStairs(int[] cost) {int x1 = cost[0];int x2 = cost[1];int y = 0;for (int i = 2; i < cost.length; i++){y = Math.min(x1, x2) + cost[i]; // 计算从第i阶楼梯起跳最少要花费的钱x1 = x2;x2 = y;}return Math.min(x1, x2);}
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

这篇关于【力扣一刷】代码随想录day38(动态规划part1:509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901855

相关文章

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

Python使用Matplotlib和Seaborn绘制常用图表的技巧

《Python使用Matplotlib和Seaborn绘制常用图表的技巧》Python作为数据科学领域的明星语言,拥有强大且丰富的可视化库,其中最著名的莫过于Matplotlib和Seaborn,本篇... 目录1. 引言:数据可视化的力量2. 前置知识与环境准备2.1. 必备知识2.2. 安装所需库2.3

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建