代码随想录算法训练营day38

devtools/2024/9/23 4:21:56/

题目:509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

参考链接:代码随想录

理论基础

DP就是一个状态由上一个子状态推导出来的问题,区别贪心主要由一个状态推导的过程。

解题五部曲

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

debug方法
打印DP数组,检查推导思路是否正确

509. 斐波那契数

思路:五部曲来走,第一步dp数组,dp[i]即第i个数的F(i);递推公式即为dp[i]=dp[i-1]+dp[i-2],直接给出来了;初始化,也就是dp[0]和dp[1],直接给出;遍历顺序,直接由递推公式看出,从前往后遍历;举例推导,这个比较容易,这题就不举例了。时间复杂度O(2^n)。注意求递归算法的时间复杂度,就是看递归调用了多少次,对于斐波那契数,第一层调用1次,第二层2次,第三层4次,加起来就是等比数列求和公式,为O(2^n)。

class Solution {
public:int fib(int n) {if(n<=1){return n;}return fib(n-2)+fib(n-1);}
};

递归代码很容易写出,看完标答也可以直接从头开始一个个往后求解。时间复杂度只要O(n),空间复杂度只要O(1)。
代码如下:

class Solution {
public:int fib(int N) {if (N <= 1) return N;int dp[2];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= N; i++) {int sum = dp[0] + dp[1];dp[0] = dp[1];dp[1] = sum;}return dp[1];}
};

70. 爬楼梯

思路:这题一开始没思路,因为不够直观,我们采用DP五部曲。首先思考爬1层楼梯,有1种方法,爬2层楼梯,有2种方法,而爬3层,就是爬第一层,再跨两步,或者爬2层,再跨一步。本题只需要求出方法数,故dp数组表示爬第i层需要的方法数;递归公式,dp[i]=dp[i-1]+dp[i-2],即先爬i-1层加1步或者先爬i-2层加2步;初始化比较容易;遍历顺序也是从少到多;举例比较容易。如果不用递归,时间复杂度O(n)。

class Solution {
public:int climbStairs(int n) {if(n<=2){return n;}int dp1=1,dp2=2;for(int i=3;i<=n;i++){int sum=dp1+dp2;dp1=dp2;dp2=sum;}return dp2;}
};

746. 使用最小花费爬楼梯

思路:同样DP五部曲。首先是dp数组,dp[i]记录爬到i台阶需要的最小cost,注意本题是求最小体力,故dp必须时刻记录最小;然后是递推公式,可以从dp[i-1]走一步花费cost[i-1],或者从dp[i-2]走两步花费cost[i-2],二者取min;初始化,本题说可以从0或1开始,说明到达0和1是不收费的,故dp[0]和dp[1]都初始化为0;遍历顺序从低到高;举例略。时间复杂度O(n)。
这些题目的遍历顺序都比较直观,后续还有遍历顺序不好确定的题目。

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {//本题cost长度至少为2,故不要单独返回0和1int dp[2];dp[0]=0;dp[1]=0;for(int i=2;i<=cost.size();i++){int sum=min(dp[0]+cost[i-2],dp[1]+cost[i-1]);dp[0]=dp[1];dp[1]=sum;}return dp[1];}
};

http://www.ppmy.cn/devtools/20094.html

相关文章

@Value

Value 注解是 Spring 框架中的一个注解&#xff0c;用于从属性文件、环境变量、Java 系统属性等地方读取值&#xff0c;并将这些值注入到 Spring 管理的 Bean 中。 Component public class MyBean {Value("${my.property}")private String myProperty;// Getter and…

Linux 创建磁盘分区以及挂载磁盘-详解(图文)

命令 查看磁盘使用情况命令&#xff1a; # 查看系统分区 fdisk -l # 查看硬盘分区 fdisk 路径 查看所有可用的块设备信息&#xff0c;并显示他们之间的依赖关系。 lsblk 我这里是已经挂载好了 确定分区文件系统类型 blkid 目录路径 使用fdisk 创建分区 [rootlocalhost…

Jmeter之Beanshell详解

一、 Beanshell概念 Beanshell: BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性…

C语言入门课程学习记录4

C语言入门课程学习记录4 第18课 - signed 与 unsigned第19课 - 再论数据类型第20课 - 经典问题剖析第21课 - 程序中的辅助语句&#xff08;上&#xff09;第22课 - 程序中的辅助语句&#xff08;下&#xff09; 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;…

TCP/IP网络模型

应用层 应用层服务于用户&#xff0c;比如说我们在电脑上使用的软件&#xff0c;都是在应用层上实现的&#xff0c;当不同设备通信时&#xff0c;数据由下一层的传输层实现。应用层提供的功能比如HTTP、FTP、Telnet、DNS、SMTP等。应用层是工作在操作系统中的用户态&#xff0…

DELL PowerEdge服务器通过iDRAC升级BIOS遇到的问题

本文对PowerEdge 12G系统&#xff0c;也就是iDRAC 7版本升级BIOS中遇到的几个问题做个总结&#xff0c;对于其他版本理论上应该也是适用的。如果还遇到其他问题&#xff0c;可以添加VX&#xff0c;VX号为 StorageExpert 进行进一步的分析探讨。 第一个问题&#xff0c;成功下载…

设计模式-状态模式在Java中的使用示例-信用卡业务系统

场景 在软件系统中&#xff0c;有些对象也像水一样具有多种状态&#xff0c;这些状态在某些情况下能够相互转换&#xff0c;而且对象在不同的状态下也将具有不同的行为。 为了更好地对这些具有多种状态的对象进行设计&#xff0c;我们可以使用一种被称之为状态模式的设计模式…

爬虫的实战应用之短信炸弹playwright现代网页测试工具

不讲废话&#xff0c;先上原理&#xff1a; 短信炸弹&#xff0c;也就是说持续对一个手机进行发送短信&#xff0c;实现的方式就是&#xff0c;利用某些网站的登录 &#xff0c;注册的时候&#xff0c;发送短信验证码来实现。 如下图&#xff0c;其中有一个id为phone的输入框&a…