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

【代码随想录训练营】【Day32】第八章|贪心算法|122.买卖股票的最佳时机II |55. 跳跃游戏|45.跳跃游戏II

买卖股票的最佳时机II

题目详细:LeetCode.122

买卖股票的最佳时机,怎么都能够想出来个思路,假如我们每天都能预知明天的股票是涨是降,那么贪心策略就是在涨之前买股票,在降的前一天卖掉,这就是买卖股票的最佳时机。

于是我立马一顿模拟!

Java解法(贪心,模拟):

class Solution {public int maxProfit(int[] prices) {if(prices.length <= 2){return prices.length > 1 && prices[0] < prices[1] ? prices[1] - prices[0]: 0;}int buy = -1, sale = -1, pre = 0, cur = 1, count = 0, max = 0;while(cur < prices.length){if(buy == -1 && prices[pre] < prices[cur]){buy = prices[pre];}if(buy != -1 && sale == -1 && (prices[pre] > prices[cur] || cur + 1 == prices.length)){sale = Math.max(prices[pre], prices[cur]);count += sale - buy;buy = -1;sale = -1;}pre++;cur++;max = Math.max(max, count);}return max;}
}

这个模拟解法是完全能够AC的,但时间代码看起来就很复杂,因为是从整体去计算买卖股票的利润。

不过我们也可以把利润分解为每天为单位的维度,只需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,然后将正利润的数值都相加得到最终利润,不需要记录买卖的区间,可得贪心策略:

  • 局部最优解:收集每天的正利润
  • 全局最优解:累计正利润可得最大利润

Java解法(贪心):

class Solution {public int maxProfit(int[] prices) {int ans = 0;int[] profits = new int[prices.length - 1];for(int i = 1; i < prices.length; i++){profits[i - 1] = prices[i] - prices[i - 1];if(profits[i - 1] > 0) ans += profits[i - 1];}return ans;}
}

跳跃游戏

题目详细:LeetCode.55

个人觉得卡哥的题解写得非常清晰易懂,所以我就不加以赘述了,详细的题解可查阅:《代码随想录》— 跳跃游戏

这题的思路需要转化一下,转化为跳跃的覆盖范围能不能覆盖到终点:

  • 从数组的第一个下标开始,计算其跳跃覆盖范围内所有下标的最大跳跃长度
  • 记录并得到最大的跳跃覆盖范围cover,就更新最大的跳跃覆盖范围
  • 注意条件是i <= cover不是i <= nums.length,因为跳跃的覆盖范围应该是连续的

贪心策略:

  • 局部最优解:每一次都计算出最大跳跃覆盖范围)
  • 整体最优解:最后得到整体的最大覆盖范围,看是否能到终点(nums.length - 1)。
class Solution {public boolean canJump(int[] nums) {int cover = 0, i = 0;while(i <= cover && cover < nums.length - 1){cover = Math.max(cover, i + nums[i++]);}return cover >= nums.length - 1;}
}

跳跃游戏II

题目详细:LeetCode.45

这道题相较于上一题,区别在于要求计算到达终点的最少跳跃次数是多少

前一题只要求判断是否能够跳跃到终点,我们只需要求从下标为0的位置开始,其覆盖范围内每一个元素的最大跳跃覆盖距离是多少,在过程中如果能够覆盖到终点就返回true;

但是这一题要求最少跳跃次数,所以就多了一个问题,在跳跃过程中能够判断其是否能够覆盖到终点,但是什么时候应该累计跳跃次数呢?

下面我们将本题的解题思路和上一题做对比,说明在做题时需要注意的地方:

题目说明从下标为0的位置开始跳跃,所以我们可以初始化一个跳跃覆盖范围,大小为nums[0],我们可以利用上一题的思路,计算出后续跳跃覆盖范围内每一个位置的跳跃覆盖范围,但是在这一题中,我们需要额外定义一个变量pre_cover,来记录当前这一步的跳跃覆盖范围,为什么呢?

因为我们的贪心策略需要遍历当前这一步的跳跃覆盖范围内所有的位置,并计算出它们的跳跃覆盖范围,保证下一次跳跃的位置,能够让我们尽可能的跳得更远,并记录一个最大的跳跃覆盖范围并更新到变量cover

如果我们直接更新cover,那么由于题目保证所有的测试样本都能跳跃到达终点,且如果不修改条件i <= cover && cover < nums.length - 1的话,所以下标i将一直更新到终点,但是这样一来我们就无法确定跳跃步数更新的时机了。

具体的改动如下:

  • 定义一个变量pre_cover,并且修改循环条件为i <= cur_cover && cur_cover < nums.length - 1
  • i == cur_cover时,但是由于cur_cover < nums.length - 1,说明我们一次跳跃还不能跳跃到终点,所以需要增加跳跃次数step++,然后更新cur_cover = cover
  • 更新cur_cover = cover即表示我们下一步的最大跳跃覆盖距离是多少,如果下一步就能够覆盖到终点就跳出循环,则跳出循环,返回步数step + 1(这里我初始化 step = 1,结果一样),否则继续循环累计跳跃次数

最后简单描述下本题的贪心策略:

  • 局部最优解:每一步都尽可能的跳到下一步能够跳得最远的位置上,每一次跳跃到下一步后,累计一次跳跃次数
  • 整体最优解:整体跳的次数最少,跳的距离最长,累计得到跳跃到达终点的总次数

Java解法(贪心):

class Solution {public int jump(int[] nums) {if(nums.length == 1 || nums.length == 2){return nums.length - 1;}int cover = 0, cur_cover = nums[0], i = 0, step = 1;while(i <= cur_cover && cur_cover < nums.length - 1){cover = Math.max(cover, i + nums[i]);if(i++ == cur_cover){step++;cur_cover = cover;}}return step; }
}

注意:我的题解中为什么使用的特判条件是nums.length == 1 || nums.length == 2

因为题目把测试样本的要求放宽了,保证给出的测试样本都可以到达中终点nums[n-1],所以对于非法的输入,如[0,0],我的题解并不能够得出正确的结果,感兴趣的可以在本题解的基础上修改编码,保证其严谨性。


在做贪心的题目时,我们一开始都是直接开始模拟,模拟AC后我很开心,不过还是得等到看了题解,才晓得其中的贪心策略,然后用更加简洁的编码再次解题。

这样做虽然很耗时,但是也让我对贪心策略的理解有了越来越得心应手的感觉,甚至能够像最后一题一样,再做题之后,根据自己的思路和上一题的思路做比较,写出两道题的不同的和需要注意的地方。

昨晚做到最后一题的时候,很困了,本来想着要不要直接看题解过了算了,但是我下定决心直接睡觉,盖上电脑等明天再来想一想,很开心自己没有放弃,我发现我这种笨人,做事没啥效率的,更应该在学习和做题时不要太去关心时间上的损失,有所收获才是最重要的!

如果还是跟以前一样遇到困难就退缩,看书学习都是囫囵吞枣,到头来不仅花了时间还一事无成,落笔一句诗激励一下自己:

长风破浪会有时,直挂云帆济沧海。

相关文章:

【代码随想录训练营】【Day32】第八章|贪心算法|122.买卖股票的最佳时机II |55. 跳跃游戏|45.跳跃游戏II

买卖股票的最佳时机II 题目详细&#xff1a;LeetCode.122 买卖股票的最佳时机&#xff0c;怎么都能够想出来个思路&#xff0c;假如我们每天都能预知明天的股票是涨是降&#xff0c;那么贪心策略就是在涨之前买股票&#xff0c;在降的前一天卖掉&#xff0c;这就是买卖股票的…...

constexpr 和 常量表达式

&#x1f440;&#x1f440;常量表达式 常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。 字面值属于常量表达式&#xff0c;用常量表达式初始化的const对象也是常量表达式。 那么是什么来就决定是不是常量表达式呢&#xff1f;一个对象是不是常量表达式主要…...

Vue响应式原理————Object.defineProperty()和proxy的用法分享

Vue框架一个比较核心的功能就是我们的数据是响应式的&#xff0c;这样我们在修改数据的时候&#xff0c;页面会自动帮我们更新&#xff0c;那么想要实现这个功能就要实现对一个数据的劫持&#xff0c;即在取值和设置值的同时我们能够检测到即数据劫持。vue2响应式的实现原理所依…...

CSDN 编程竞赛三十四期题解

竞赛总览 CSDN 编程竞赛三十四期&#xff1a;比赛详情 (csdn.net) 本期的题目和第三十一期竞赛的题目竟然高度重合&#xff0c;真不知道该写点什么了。 不过&#xff0c;上次那道测试数据有bug的题已经修复了&#xff0c;答题过程挺顺利的&#xff0c;没有遇到新的问题。 竞…...

C#教程06 运算符

文章目录 一、算术运算符加法运算符(+)减法运算符(-)乘法运算符(*)除法运算符(/)二、逻辑运算符与运算符(&&)或运算符(||)非运算符(!)三、比较运算符等于运算符(==)大于运算符(>)小于运算符(<)大于等于运算符(>=)小于等于运算符(<=…...

软测入门(六)pytest单元测试

pytest pytest是python的一种单元测试框架&#xff0c;同自带的unit test测试框架类似&#xff0c;但pytest更简洁高效。 单元测试&#xff1a; 测试 函数、类、方法能不能正常运行测试的结果是否符合我们的预期结果 安装 pip install -U pytest基本使用 通过pytest包使用…...

经典分类模型回顾5—DenseNet实现图像分类(matlab)

DenseNet&#xff0c;全称为Densely Connected Convolutional Networks&#xff0c;中文名为密集连接卷积网络&#xff0c;是由李沐等人在2017年提出的一种深度神经网络架构。 DenseNet旨在解决深度神经网络中的梯度消失问题和参数数量过多的问题&#xff0c;通过构建密集连接…...

基于flask+bootstrap+echarts+mysql的鱼村小馆订餐后台管理系统

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…...

Spark使用Log4j将日志发送到Kafka

文章目录自定义KafkaAppender修改log4j.properties配置启动命令配置添加参数启动之后可以在Kafka中查询发送数据时区问题-自定义实现JSONLayout解决自定义JSONLayout.java一键应用可能遇到的异常ClassNotFoundException: xxx.KafkaLog4jAppenderUnexpected problem occured dur…...

c++类与对象整理(上)

目录 1.类的引入 2.类的定义 3.类的访问限定符及封装 1&#xff09;访问限定符 2&#xff09;封装 4.类的作用域 5.类的实例化 6.类的对象大小的计算 1&#xff09;类对象的存储方式 2&#xff09;内存对齐和大小计算 ​编辑 7.类成员函数的this指针 1&#xff09…...

Docker学习(十九)什么是镜像的元数据?

在 Docker 中&#xff0c;镜像的元数据是指与镜像相关的所有信息&#xff0c;包括镜像的名称和标签、作者、描述、创建日期、环境变量、命令等。这些信息都是通过 Dockerfile 或命令行创建和指定的。 镜像的元数据被存储在 Docker Registry 中&#xff0c;并在使用 docker pull…...

Python如何获取弹幕?给你介绍两种方式

前言 弹幕可以给观众一种“实时互动”的错觉&#xff0c;虽然不同弹幕的发送时间有所区别&#xff0c;但是其只会在视频中特定的一个时间点出现&#xff0c;因此在相同时刻发送的弹幕基本上也具有相同的主题&#xff0c;在参与评论时就会有与其他观众同时评论的错觉。 在国内…...

JAVA- AOP 面向切面编程 Aspect切面工具类 记录特定方法执行时的入参、执行时间、返参等内容

背景&#xff1a;JAVA项目&#xff0c;使用AOP对指定函数进行切面。能够记录特定方法执行时的入参、执行时间、返参结果等内容。 文章目录1、自定义注解类1.1 Target1.2 Retention2、Aspect切面工具2.1 JointPoint2.2 Pointcut2.3 切面中的相关注解3、同一个类里调用AOP4、其他…...

「史上最全的 TCG 规范解读」TCG 规范架构概述(下)

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强不同计算机平台上计算环境的安全性。TCG 于 2003 年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Allia…...

GDScript 导出变量 (4.0)

概述 导出变量的功能在3.x版本中也是有的&#xff0c;但是4.0版本对其进行了语法上的改进。 导出变量在日常的游戏制作中提供节点的自定义参数化调节功能时非常有用&#xff0c;除此之外还用于自定义资源。 本文是&#xff08;Bilibili巽星石&#xff09;在4.0官方文档《GDScr…...

JAVA知识点全面总结6:泛型反射和注解

六.JAVA知识点全面总结6泛型反射和注解 1.什么是泛型?可以用在哪里&#xff1f; 2.泛型擦除机制是什么&#xff1f;为什么擦除&#xff1f; 3.通配符是什么&#xff1f;作用是什么&#xff1f; 未更新 1.注解是什么&#xff1f;有什么用&#xff1f; 2.注解的自定义和实…...

死代码删除(DCE,Dead Code Elimination)和激进的死代码删除(ADCE,Aggressive DCE)

死代码删除&#xff08;DCE&#xff0c;Dead Code Elimination&#xff09;和激进的死代码删除&#xff08;ADCE&#xff0c;Aggressive DCE&#xff09;死代码删除&#xff08;DCE&#xff0c;Dead Code Elimination&#xff09;DCE简介DCE基本算法激进的死代码删除&#xff0…...

询问new bing关于android开发的15个问题(前景、未来、发展方向)

前言&#xff1a;new bing是基于chat-gpt的新搜索工具&#xff0c;可以采用对话方式进行问题搜索&#xff0c;经过排队等候终于可以使用new bing&#xff0c;询问了目前我最关心的关于android开发几个问题 文章目录1.如何学好android开发&#xff1f;2.android开发能做什么?3.…...

【C++】初识类和对象

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、面向过程和面向对象初步认识二…...

EPICS S7nodave手册

第一章&#xff1a;介绍 本手册分为6章(不算次介绍部分)。第一章介绍s7nodave用于EPICS的设备支持的概念和特新。第二章描述启动一个使用s7nodave的IOC项目所需要的几步。第三章描述s7nodave支持的IOC shell命令。之后&#xff0c;第四章解释s7nodave支持的各种记录类型。最后…...

TCP 是用来解决什么问题:从 IP 的不可靠到可靠的端到端通信

TCP 是用来解决什么问题&#xff1a;从 IP 的不可靠到可靠的端到端通信01. 前言&#xff1a;为什么有了 IP 还不够&#xff1f;02. IP 协议的四大先天缺陷03. TCP 要解决的六大核心问题04. 问题一&#xff1a;丢包 → 确认 超时重传4.1 问题描述4.2 TCP 的解决方案05. 问题二&…...

Python @contextmanager 装饰器完全指南

在Python编程实践中&#xff0c;资源管理是一个永恒的话题。无论是文件句柄、数据库连接还是临时状态变更&#xff0c;我们都需要确保资源被正确分配并在使用后得到妥善清理。虽然传统的try...finally语句可以解决这个问题&#xff0c;但Python提供了更加优雅的解决方案——上下…...

W5500 TCP客户端实战 | 02 - 从寄存器配置到数据收发的完整流程解析

1. W5500网络寄存器配置详解 第一次接触W5500芯片时&#xff0c;我被它密密麻麻的寄存器地址搞得头晕眼花。后来发现只要抓住几个核心寄存器&#xff0c;配置起来就像填快递单一样简单。先说说最关键的四个本地网络寄存器&#xff0c;它们相当于设备的"身份证"&#…...

MDIN380芯片高清视频处理方案:SDI转VGA与LVDS转换,专业PCB设计与源码集成

MDIN380 SDI转VGA 转LVDS VGA转SDI 高清视频处理 MDIN380芯片 PCB代码方案资料 3G-SDI转VGA ?3G-SDI转LVDS ?高清视频 MDIN380、GV7601 芯片方案(PCB图和源码)。 此方案是韩国视频处理芯片MDIN380的整合应用方案。 3G-SDI转VGA或3G-SDI转LVDS。 方案共有两块电路板(一块底板…...

2025届最火的十大降重复率助手推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 将AI论文查重系统&#xff0c;基于自然语言处理&#xff0c;与深度学习模型相结合&#xff0…...

Linux文件搜索新标杆:FSearch高效检索工具全攻略

Linux文件搜索新标杆&#xff1a;FSearch高效检索工具全攻略 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 在Linux系统中&#xff0c;面对日益增长的文件数据&#…...

Transformer双模态新玩法:CodeBERT如何同时理解代码和自然语言?

Transformer双模态新玩法&#xff1a;CodeBERT如何同时理解代码和自然语言&#xff1f; 在AI领域&#xff0c;让机器同时理解编程语言和自然语言一直是个令人着迷的挑战。想象一下&#xff0c;一个模型既能读懂Python代码的逻辑结构&#xff0c;又能理解开发者用英语写的注释文…...

【西瓜带你学设计模式 | 第十二期 - 装饰器模式】装饰器模式 —— 动态叠加功能实现、优缺点与适用场景

文章目录前言1. 装饰器模式是什么&#xff1f;2. 装饰器模式解决什么问题&#xff1f;3. 实现步骤4. 静态结构4.1 抽象组件&#xff1a;Coffee&#xff08;统一接口&#xff09;4.2 具体组件&#xff1a;SimpleCoffee&#xff08;基础咖啡&#xff09;4.3 装饰器抽象类&#xf…...

多年研究图像增强算法,包括但不限于:retinex,gamma,clahe,滤波算法。如果有需要此方面的需要,可以找我哦,理论算法打包带走

多年研究图像增强算法&#xff0c;包括但不限于&#xff1a;retinex&#xff0c;gamma&#xff0c;clahe&#xff0c;滤波算法。如果有需要此方面的需要&#xff0c;可以找我哦&#xff0c;理论算法打包带走...

2026最权威的十大AI科研工具实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek AI技术于毕业论文写作里的应用愈发广泛&#xff0c;借助大语言模型&#xff0c;学生能够在选…...