代码随想录刷题题Day26

刷题的第二十六天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++
Day26 任务
● 动态规划理论基础
● 斐波那契数
● 爬楼梯
● 使用最小花费爬楼梯

1 动态规划理论基础

在这里插入图片描述
对于动态规划问题,拆解为五个步骤:
(1)确定dp数组以及下标的含义
(2)确定递推公式
(3)dp数组如何初始化
(4)遍历顺序
(5)举例推导dp数组

2 斐波那契数

斐波那契数
在这里插入图片描述
思路:
递归法
C++:

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

时间复杂度: O ( 2 n ) O(2^n) O(2n)
空间复杂度: O ( n ) O(n) O(n)
动态规划

用一个一维的dp数组保存递归的结果

(1)确定dp数组以及下标的含义
dp[i]的定义为:第i个数的斐波那契数值是dp[i]
(2)确定递推公式
状态转移方程: d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i] = dp[i - 1] + dp[i - 2] dp[i]=dp[i1]+dp[i2]
(3)dp数组如何初始化

dp[0] = 0;
dp[1] = 1;

(4)遍历顺序

dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的

(5)举例推导dp数组
把dp数组打印出来看看和我们推导的数列是不是一致的
C++:

class Solution {
public:
    int fib(int n) {
        if (n <= 1) return n;
        vector<int> dp(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];
    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
本题只需要维护两个数值
C++:

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

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

3 爬楼梯

爬楼梯
在这里插入图片描述
思路:
动态规划
(1)确定dp数组以及下标的含义
dp[i]: 爬到第i层楼梯,有dp[i]种方法
(2)确定递推公式

dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶就是dp[i]
dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶就是dp[i]
d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i] = dp[i - 1] + dp[i - 2] dp[i]=dp[i1]+dp[i2]

(3)dp数组如何初始化

dp[0] = 1;
dp[1] = 1;

(4)遍历顺序:从前往后
(5)举例推导dp数组
在这里插入图片描述
C++:

class Solution {
public:
    int climbStairs(int n) {
        if (n <= 1) return n;
        vector<int> dp(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];
    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
优化代码:

class Solution {
public:
    int climbStairs(int n) {
        if (n <= 1) return n;
        int dp[3];
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            int sum = dp[1] + dp[2];
            dp[1] = dp[2];
            dp[2] = sum;
        }
        return dp[2];
    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

4 使用最小花费爬楼梯

使用最小花费爬楼梯
在这里插入图片描述
思路:
动态规划

可以选择从下标为0或下标为1的台阶开始爬楼梯就是相当于跳到下标 0或者下标1是不花费体力的, 从 下标 0 下标1 开始跳就要花费体力了

(1)确定dp数组以及下标的含义
dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]
(2)确定递推公式

有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]
dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]
dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]

dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

(3)dp数组如何初始化

dp[0] = 0;
dp[1] = 0;

(4)遍历顺序:从前到后遍历cost数组
(5)举例推导dp数组
在这里插入图片描述
C++:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size() + 1);
        dp[0] = 0;// 默认第一步都是不花费体力的
        dp[1] = 0;
        for (int i = 2; i <= cost.size(); i++) {
            dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }
        return dp[cost.size()];
    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
优化:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int dp0 = 0;
        int dp1 = 0;
        for (int i = 2; i <= cost.size(); i++) {
            int dpi = min(dp1 + cost[i - 1], dp0 + cost[i - 2]);
            dp0 = dp1; // 记录一下前两位
            dp1 = dpi;
        }
        return dp1;
    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)


鼓励坚持二十七天的自己😀😀😀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/296422.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小白入门基础 - spring Boot 入门

1.简介 spring Boot是为了简化java的开发流程而构建的&#xff0c;即使是使用springMVC框架&#xff0c;也依然需要大量配置和依赖导入&#xff0c; 这无疑是繁琐的&#xff0c;spring Boot采用了”习惯由于配置“的原则&#xff0c;进行一键化部署&#xff0c;这样极大…

【建议收藏】一文全面解读Linux最常用的解压缩命令(tar、zip、unzip、gzip、guznip、bzip2、bunzip2)

一文全面解读Linux最常用的解压缩命令&#xff08;tar、zip、unzip、gzip、guznip、bzip2、bunzip2&#xff09;&#xff0c;建议收藏 文章目录 一文全面解读Linux最常用的解压缩命令&#xff08;tar、zip、unzip、gzip、guznip、bzip2、bunzip2&#xff09;&#xff0c;建议收…

2017年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

昨天&#xff0c;六分成长给大家了做了一套2024年AMC8比赛的全真模拟试题&#xff0c;40分钟&#xff0c;25道题&#xff0c;并且提供了答案&#xff0c;所有试题来自过去20年的真题&#xff0c;不知道你做对了多少&#xff1f;一定要让孩子抽40分钟&#xff0c;认真的做一做&a…

mnn-llm: 大语言模型端侧CPU推理优化

在大语言模型(LLM)端侧部署上&#xff0c;基于 MNN 实现的 mnn-llm 项目已经展现出业界领先的性能&#xff0c;特别是在 ARM 架构的 CPU 上。目前利用 mnn-llm 的推理能力&#xff0c;qwen-1.8b在mnn-llm的驱动下能够在移动端达到端侧实时会话的能力&#xff0c;能够在较低内存…

数字人克隆:人类科技进步的里程碑

数字人克隆&#xff0c;作为一项引起广泛争议和关注的科技创新&#xff0c;正在逐渐走向我们的生活。它是将人的意识和思想复制到数字化的实体中&#xff0c;从而使之与真正的人类无异。数字人克隆的出现不仅引发了人们对道德伦理问题的讨论&#xff0c;也给人类社会带来了巨大…

频率域图像增强之理想低通滤波器的python实现——数字图像处理

原理 理想低通滤波器&#xff08;Ideal Low-Pass Filter, ILPF&#xff09;是数字图像处理中一个重要的概念&#xff0c;尤其在频率域滤波中扮演着关键角色。 定义&#xff1a; 理想低通滤波器是一种在频率域内工作的滤波器&#xff0c;旨在通过允许低频信号通过同时阻止高频信…

mysql5.7安装-windwos免安装版本

下载地址 官网地址:https://www.mysql.com/官网下载地址:https://dev.mysql.com/downloads/mysql/阿里云镜像站下载:https://mirrors.aliyun.com/mysql/华为云镜像站地址:https://mirrors.huaweicloud.com/home华为云镜像站下载:https://mirrors.huaweicloud.com/mysql/Downlo…

MSVCP140_1.dll文件丢失的解决方法指南,MSVCP140_1.dll最快捷的修复手段

在近些年里&#xff0c;随着电脑技术的迅猛进步&#xff0c;我们对操作系统变得越来越依赖。然而&#xff0c;在使用过程中&#xff0c;我们也可能偶遇一些技术挑战&#xff0c;比如遇到 MSVCP140_1.dll 文件丢失的问题。本文旨在深入探讨这个常见的技术难题&#xff0c;并为大…

跑通大模型领域的 hello world

跑通书生浦语大模型的 3 个趣味 demo&#xff08;InternLM-Chat-7B 智能对话、Lagent工具调用解简单数学题、浦语灵笔多模态图文创作和理解&#xff09;视频和文档。 1、两个框架 InternLM 是⼀个开源的轻量级训练框架&#xff0c;旨在⽀持⼤模型训练⽽⽆需⼤量的依赖。 Lage…

瞧瞧别人家的电商【淘宝1688京东】API接口,那叫一个优雅

淘宝、京东等电商平台的API接口确实非常强大和优雅&#xff0c;它们提供了丰富的功能和数据&#xff0c;使得开发者可以轻松地与平台进行交互&#xff0c;实现各种应用和功能。 以下是一些可能会让你感到优雅的淘宝、京东等电商平台的API接口特点&#xff1a; 接口设计简洁明…

力扣:15.三数之和

1.做题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.做题前须&#xff1a; 两数之和降低复杂度&#xff1a; 1.问题描述&#xff1a;一个数组中找到两个数字之和是taeget 例如&#xff1a;[2,7,11,15,19,21],target30 2.解法一&#xff1a;暴力枚举时间复…

【致远FAQ】V8.0_甘特图能不能实现行表头一级一级显示(树形结构)

问题描述 甘特图能不能实现行表头一级一级显示&#xff08;树形结构&#xff09; 问题解决 设置统计时把合并同类型和显示行合计都勾选上就可以了 效果参考

element中Tree 树形控件实现多选、展开折叠、全选全不选、父子联动、默认展开、默认选中、默认禁用、自定义节点内容、可拖拽节点、手风琴模式

目录 1.代码实现2. 效果图3. 使用到的部分属性说明4. 更多属性配置查看element官网 1.代码实现 <template><div class"TreePage"><el-checkboxv-model"menuExpand"change"handleCheckedTreeExpand($event, menu)">展开/折叠&l…

非接触式红外测温MLX90614

1.MLX90614简介 MX90614是一款由迈来芯公司提供的低成本&#xff0c;无接触温度计。输出数据和物体温度呈线性比例&#xff0c;具有高精度和高分辨率。TO-39金属封装里同时集成了红外感应热电堆探测器芯片MLX81101&#xff08;温度是通过PTC或是PTAT元件测量&#xff09;和信号…

vue简单实现滚动条

背景&#xff1a;产品提了一个需求在一个详情页&#xff0c;一个form表单元素太多了&#xff0c;需要滚动到最下面才能点击提交按钮&#xff0c;很不方便。他的方案是&#xff0c;加一个滚动条&#xff0c;这样可以直接拉到最下面。 优化&#xff1a;1、支持滚动条&#xff0c;…

uniapp 【专题详解 -- 时间】云数据库时间类型设计,时间生成、时间格式化渲染(uni-dateformat 组件的使用)

云数据表的时间类型设计 推荐使用时间戳 timestamp "createTime": {"bsonType": "timestamp","label": "创建时间&#xff1a;" }时间生成 获取当前时间 Date.now() .add({createTime: Date.now() })时间格式化渲染 下载安…

Prototype原型模式(对象创建)

原型模式&#xff1a;Prototype 链接&#xff1a;原型模式实例代码 注解 模式定义 使用原型实例指定创建对象的种类&#xff0c;然后通过拷贝这些原型来创建新的对象。 ——《设计模式》GoF 目的 在软件系统中&#xff0c;经常面临这“某些结构复杂的对象”的创建工作&am…

Chapter 7 - 10. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理

Detecting Congestion on a Remote Monitoring Platform Remote monitoring platforms can monitor all the ports in a network simultaneously to provide network-wide single-pane-of-glass visibility. 远程监控平台可同时监控网络中的所有端口,以提供全网单一窗口可视性…

selenium 用webdriver.Chrome 访问网页闪退解决方案

1.1.1. 解决方案&#xff1a; 1.1.1.1. 移动插件到谷歌的安装目录下 1.1.1.2. 设置环境变量 1.1.1.3. 重启电脑检查成功 解决时间&#xff1a;5min

Springcloud 微服务实战笔记 Eureka

服务治理 服务注册 在服务治理框架中&#xff0c;通常都会构建一个注册中心&#xff0c;每个服务单元向注册中心登记自己提供的服务&#xff0c;将主机与端口号、版本号、通信协议等一些附加信息告知注册中心&#xff0c;注册中心按服务名分类组织服务清单。当服务启动后&…