代码随想录训练营第三十二天打卡|122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

122.买卖股票的最佳时机II

1.做的时候感觉不难,自己也AC了,但是一下子说清楚为什么这样做并不容易。思考之后,我得到了一个自己感觉还算形象的解释。股票价格走势是一个折线图,两天之间的股票价格构成一条折线。我们只要在每一条上升折线的起始点买入,结束点卖出不放过任何一个赚钱的机会就能获得最大利润。当前最优推出整体最优,典型的贪心,折线模型类似于之前的摆动序列。(注:该算法源于我们站在上帝视角知道之后几天股票的价格,现实中并不可行)

class Solution {
public://贪心:今天能赚就卖,明天能赚就买,不放弃任何一个赚钱的机会int maxProfit(vector<int>& prices) {int sum = 0;for (int i = 0; i + 1 < prices.size(); i++) {if ((prices[i + 1] - prices[i]) > 0)sum += prices[i + 1] - prices[i];}return sum;}
};

2.随想录版

class Solution {
public://思想是一样的,当前赚钱就买卖int maxProfit(vector<int>& prices) {int result = 0;for (int i = 1; i < prices.size(); i++) {result += max(prices[i] - prices[i - 1], 0);}return result;}
};

55. 跳跃游戏

1.贪心有时候就是朴素思想。本题我们一个朴素的思想就是如果当前位置跳不到最后位置,那我们就在当前位置能跳到的位置中选择能跳的最远的那个,这其实就是贪心!跳的最远的那个位置意味着之后有最多的选择,当前最优推出整体最优。

class Solution {
public:bool canJump(vector<int>& nums) {int sum = 0; // sum表示当前能跳跃到的最远下标//遍历当前元素能跳跃到的位置for (int i = 0; i <= sum; i++) {//如果当前位置能跳到最后直接返回trueif (nums[i] >= nums.size() - i - 1)return true;//如果不能就尝试更新能跳到的最远的位置if (nums[i] + i >= sum)sum = nums[i] + i;}return false;}
};

2.随想录版,本质是一样的,cover代表能覆盖的跳跃范围。

class Solution {
public:bool canJump(vector<int>& nums) {int cover = 0;if (nums.size() == 1)return true; // 只有一个元素,就是能达到for (int i = 0; i <= cover; i++) { // 注意这里是小于等于covercover = max(i + nums[i], cover);if (cover >= nums.size() - 1)return true; // 说明可以覆盖到终点了}return false;}
};

45.跳跃游戏II

1.其实本题的思路和之前是一样的,每次在能跳到的位置中选择能跳地最远的那个,那么最后的跳跃次数就是最小的那个。只不过本题相比于上一题的难度在于跳跃次数的统计,核心是每次跳到最远的那个位置跳跃次数+1,然后在当前位置能跳跃到的那个位置选择新的那个能跳的最远的位置。其中有些细节要注意,之前的cover是实时更新的,因为我们并不关注跳数。而现在,在遍历当前位置能跳到的位置中,遍历范围是要保持不变的。所以我们要用一个变量cover1接住cover值用于遍历,然后再在遍历过程中更新cover值,当找到新的最大cover值需要记录下次遍历的起始位置i。除此之外,当我们发现当前位置能跳到最后,跳跃次数也要+1。

class Solution {
public:int jump(vector<int>& nums) {if (nums.size() == 1)return 0;// cover表示当前跳跃下标最大值,初始值为数组初始位置int count = 0, cover = nums[0], i = 0;//遍历数组模拟跳跃过程,找跳数while (i < nums.size() - 1) {//跳跃下标能覆盖数组,跳数+1然后跳出循环if (cover >= nums.size() - 1) {count++;break;}int cover1 = cover; //复制cover值//利用复制的cover值更新cover值for (int j = i; j <= cover1; j++) {//找到跳的最远的那个位置并跳到这个位置if (nums[j] + j > cover) {cover = nums[j] + j;i = j;}}count++; //每跳一次,跳数+1}return count;}
};

2.随想录版,个人觉得随想录代码虽然简洁,但其实并不是那么容易理解。代码的逻辑应该是这样的:每次确定了起跳位置跳数+1,这也是i < nums.size() - 1的原因所在。因为题目保证一定能跳到最后,所以起跳位置最多只能是nums.size() - 2。这样做的好处是下标i不用回溯,因为当前覆盖的最远距离下标是不断增大的。

class Solution {
public:int jump(vector<int>& nums) {int curDistance = 0;  // 当前覆盖的最远距离下标int ans = 0;          // 记录走的最大步数int nextDistance = 0; // 下一步覆盖的最远距离下标for (int i = 0; i < nums.size() - 1;i++) { // 注意这里是小于nums.size() - 1,这是关键所在nextDistance =max(nums[i] + i, nextDistance); // 更新下一步覆盖的最远距离下标if (i == curDistance) { // 遇到当前覆盖的最远距离下标curDistance = nextDistance; // 更新当前覆盖的最远距离下标ans++;}}return ans;}
};

今日总结:我跳!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣每日一题 ---- 1039. 多边形三角剖分的最低得分

这题的难点在哪部分呢&#xff0c;其实是怎么思考。这道题如果之前没做过类似的话&#xff0c;还是很难看出一些性质的&#xff0c;这题原本的话是没有图片把用例显示的这么详细的。这题中有个很隐晦的点没有说出来 剖出来的三角形是否有交叉&#xff0c;这题中如果加一个三角…

网络防御——NET实验

一、实验拓扑 二、实验要求 1、生产区在工作时间&#xff08;9&#xff1a;00---18&#xff1a;00&#xff09;内可以访问服务区&#xff0c;仅可以访问http服务器&#xff1b; 2、办公区全天可以访问服务器区&#xff0c;其中&#xff0c;10.0.2.20可以访问FTP服务器和HTTP服…

水文模型SWMM与LisFlood耦合(pdf文档、软件见资源)

总技术路线图 INP生成图解 文献&#xff1a;面向服务的Web-SWMM构建研究 regardingINP为ArcGIS Pro项目 1.SWMM模型数据准备与参数设置 1.子汇水区 文件位于&#xff1a;beforeGenerateINP/generateSub.py&#xff08;一级划分&#xff09; 问题&#xff1a; 水文分析阈值划…

命令行安装vant2项目

声明&#xff1a;原文参考链接出自&#xff1a;ERROR in ./node_modules/vant export ‘createVNode‘ (imported as ‘_createVNode‘) was not found in ‘vue_error in node_modules/vant/lib/overlay/overlay.d.t-CSDN博客 已经安装Vant,但是引用Vant里面组件库时候报错&a…

重温《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》 –– 学习笔记(一)

第一部分&#xff1a;走近Java 第1章&#xff1a;走近Java 1.1 Java的技术体系 SUN 官方所定义的 Java 技术体系包括&#xff1a;Java程序设计语言、Java虚拟机、Class文件格式、Java API类库、第三方&#xff08;商业机构和开源社区&#xff09;Java类库。 其中&#xff0…

C++ 关于“常量”的知识整理:

目录 1 常量对象&#xff1a; 2 常量成员&#xff1a; 2.1常量数据成员&#xff1a; 常数据成员总结&#xff1a; 2.2常量成员函数&#xff08;使用最多&#xff09;&#xff1a; 常成员函数总结&#xff1a; 3 常量引用&#xff1a; C中常量的值在程序运行中不允许被改…

调用阿里通义千问大语言模型API-小白新手教程-python

阿里大语言模型通义千问API使用新手教程 最近需要用到大模型&#xff0c;了解到目前国产大模型中&#xff0c;阿里的通义千问有比较详细的SDK文档可进行二次开发,目前通义千问的API文档其实是可以进行精简然后学习的,也就是说&#xff0c;是可以通过简单的API调用在自己网页或…

express/koa2中使用http-proxy-middleware代理转发后端接口解决跨域问题

由于后端接口没有设置允许跨域,故前端需要自己解决,如果前端项目是node起的服务,可以使用express/koa2框架,配合http-proxy-middleware中间件转发后端接口 express中: 1.先安装依赖 npm i http-proxy-middleware -D 2.设置代理,可配置多条 var app express();// 设置反向代…

Redis为什么速度快:数据结构、存储及IO网络原理总结

Redis&#xff0c;作为内存数据结构存储的佼佼者&#xff0c;其高性能表现一直备受赞誉。那么&#xff0c;Redis究竟是如何实现这一点的呢&#xff1f;接下来&#xff0c;我们将更深入地探讨其背后的关键技术&#xff0c;并提供进一步的优化策略。 一、内存存储与数据结构设计…

本地缓存之王Caffeine 保姆级教程(值得珍藏)

1. 简介 在编程领域&#xff0c;缓存是不可或缺的一部分&#xff0c;从处理器到应用层&#xff0c;其应用无处不在。从根本上讲&#xff0c;缓存是利用空间换取时间的一种策略&#xff0c;通过优化数据存储方式&#xff0c;提高后续数据访问速度。 对于Java开发者来说&#x…

黑豹程序员-vue3实现剪贴板复制

需求 vue中实现复制文字到剪贴板上 注意 创建ClipboardJS对象时&#xff0c;第一个参数绑定组件 class的名称。此时class为此名称的才能有复制功能。 方法代码 <script setup> // npm install clipboardimport ClipboardJS from clipboard//复制文字到剪贴板const c…

【开源】基于JAVA语言的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

【现代控制系统】从状态方程导出微分方程

从状态方程导出微分方程 2023年6月20日 1. 基本方法 状态空间表达式&#xff1a; x ˙ ( t ) A x ( t ) B u ( t ) y ( t ) C x ( t ) D u ( t ) \begin{aligned} &\dot{ x}(t){ A }{ x }(t){ B }{ u } (t) \\ &{ y }(t){ C } { x }(t){ D } { u }(t) \end{alig…

基于Javaweb开发的二手图书零售系统详细设计【附源码】

基于Javaweb开发的二手图书零售系统详细设计【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统…

使用 fdisk 和 mkfs 创建并挂载新硬盘

在Linux系统中&#xff0c;管理磁盘空间是一项关键的任务。有时&#xff0c;我们需要在系统中添加新的硬盘并将其用于特定的用途&#xff0c;比如存储日志文件。本文将介绍如何在Linux系统上使用fdisk和mkfs工具创建、格式化和挂载新硬盘。 1. 确认可用磁盘 首先&#xff0c;…

java的==运算符和equals详解

①chatgpt的解释 在Java中&#xff0c;和equals都是用于比较两个对象的操作符&#xff0c;但它们的行为和用途有所不同。 操作符&#xff1a; 对于基本数据类型&#xff0c;比较的是它们的值是否相等。例如&#xff0c;int a 5; int b 5; System.out.println(a b); // 输出t…

内网穿透natapp使用教程(Linux)

我的使用场景&#xff1a;在家访问学校服务器&#xff0c;由于不在一个局域网&#xff0c;所以需要使用内网穿透&#xff0c;我使用的是natapp。需要在有局域网的时候做好以下步骤。 &#xff08;natapp官网&#xff1a;https://natapp.cn/&#xff09; 1. 下载客户端 &#x…

springboot入门2

学习目标&#xff1a; 了解数据库配置加密方法&#xff0c;数据库连接池&#xff0c;mybatis-paginationInterceptor分页&#xff0c;pagehelper分页常用功能 学习内容&#xff1a; 1、mybatis plus配置加密 1.1、生成加密配置 package sccba.example;import com.baomidou…

模式设计:工厂模式

工厂设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。工厂模式属于创建型模式&#xff0c;它在创建对象时提供了一种封装机制&#xff0c;将实际创建对象的代码与使用代码分离。 …

盲盒App小程序开发:引领未来购物新潮流

随着科技的不断发展&#xff0c;我们的购物方式也在不断改变。近年来&#xff0c;盲盒购物逐渐成为了一种新型的消费模式&#xff0c;受到了广大消费者的热烈欢迎。为了满足消费者的需求&#xff0c;越来越多的企业开始涉足盲盒App的开发。本文将探讨盲盒App开发的意义、前景以…