【代码随想录训练营】【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 题目详细:LeetCode.122 买卖股票的最佳时机,怎么都能够想出来个思路,假如我们每天都能预知明天的股票是涨是降,那么贪心策略就是在涨之前买股票,在降的前一天卖掉,这就是买卖股票的…...
constexpr 和 常量表达式
👀👀常量表达式 常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。 字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。 那么是什么来就决定是不是常量表达式呢?一个对象是不是常量表达式主要…...
Vue响应式原理————Object.defineProperty()和proxy的用法分享
Vue框架一个比较核心的功能就是我们的数据是响应式的,这样我们在修改数据的时候,页面会自动帮我们更新,那么想要实现这个功能就要实现对一个数据的劫持,即在取值和设置值的同时我们能够检测到即数据劫持。vue2响应式的实现原理所依…...
CSDN 编程竞赛三十四期题解
竞赛总览 CSDN 编程竞赛三十四期:比赛详情 (csdn.net) 本期的题目和第三十一期竞赛的题目竟然高度重合,真不知道该写点什么了。 不过,上次那道测试数据有bug的题已经修复了,答题过程挺顺利的,没有遇到新的问题。 竞…...
C#教程06 运算符
文章目录 一、算术运算符加法运算符(+)减法运算符(-)乘法运算符(*)除法运算符(/)二、逻辑运算符与运算符(&&)或运算符(||)非运算符(!)三、比较运算符等于运算符(==)大于运算符(>)小于运算符(<)大于等于运算符(>=)小于等于运算符(<=…...
软测入门(六)pytest单元测试
pytest pytest是python的一种单元测试框架,同自带的unit test测试框架类似,但pytest更简洁高效。 单元测试: 测试 函数、类、方法能不能正常运行测试的结果是否符合我们的预期结果 安装 pip install -U pytest基本使用 通过pytest包使用…...
经典分类模型回顾5—DenseNet实现图像分类(matlab)
DenseNet,全称为Densely Connected Convolutional Networks,中文名为密集连接卷积网络,是由李沐等人在2017年提出的一种深度神经网络架构。 DenseNet旨在解决深度神经网络中的梯度消失问题和参数数量过多的问题,通过构建密集连接…...
基于flask+bootstrap+echarts+mysql的鱼村小馆订餐后台管理系统
📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言Ὅ…...
Spark使用Log4j将日志发送到Kafka
文章目录自定义KafkaAppender修改log4j.properties配置启动命令配置添加参数启动之后可以在Kafka中查询发送数据时区问题-自定义实现JSONLayout解决自定义JSONLayout.java一键应用可能遇到的异常ClassNotFoundException: xxx.KafkaLog4jAppenderUnexpected problem occured dur…...
c++类与对象整理(上)
目录 1.类的引入 2.类的定义 3.类的访问限定符及封装 1)访问限定符 2)封装 4.类的作用域 5.类的实例化 6.类的对象大小的计算 1)类对象的存储方式 2)内存对齐和大小计算 编辑 7.类成员函数的this指针 1)…...
Docker学习(十九)什么是镜像的元数据?
在 Docker 中,镜像的元数据是指与镜像相关的所有信息,包括镜像的名称和标签、作者、描述、创建日期、环境变量、命令等。这些信息都是通过 Dockerfile 或命令行创建和指定的。 镜像的元数据被存储在 Docker Registry 中,并在使用 docker pull…...
Python如何获取弹幕?给你介绍两种方式
前言 弹幕可以给观众一种“实时互动”的错觉,虽然不同弹幕的发送时间有所区别,但是其只会在视频中特定的一个时间点出现,因此在相同时刻发送的弹幕基本上也具有相同的主题,在参与评论时就会有与其他观众同时评论的错觉。 在国内…...
JAVA- AOP 面向切面编程 Aspect切面工具类 记录特定方法执行时的入参、执行时间、返参等内容
背景:JAVA项目,使用AOP对指定函数进行切面。能够记录特定方法执行时的入参、执行时间、返参结果等内容。 文章目录1、自定义注解类1.1 Target1.2 Retention2、Aspect切面工具2.1 JointPoint2.2 Pointcut2.3 切面中的相关注解3、同一个类里调用AOP4、其他…...
「史上最全的 TCG 规范解读」TCG 规范架构概述(下)
可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强不同计算机平台上计算环境的安全性。TCG 于 2003 年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Allia…...
GDScript 导出变量 (4.0)
概述 导出变量的功能在3.x版本中也是有的,但是4.0版本对其进行了语法上的改进。 导出变量在日常的游戏制作中提供节点的自定义参数化调节功能时非常有用,除此之外还用于自定义资源。 本文是(Bilibili巽星石)在4.0官方文档《GDScr…...
JAVA知识点全面总结6:泛型反射和注解
六.JAVA知识点全面总结6泛型反射和注解 1.什么是泛型?可以用在哪里? 2.泛型擦除机制是什么?为什么擦除? 3.通配符是什么?作用是什么? 未更新 1.注解是什么?有什么用? 2.注解的自定义和实…...
死代码删除(DCE,Dead Code Elimination)和激进的死代码删除(ADCE,Aggressive DCE)
死代码删除(DCE,Dead Code Elimination)和激进的死代码删除(ADCE,Aggressive DCE)死代码删除(DCE,Dead Code Elimination)DCE简介DCE基本算法激进的死代码删除࿰…...
询问new bing关于android开发的15个问题(前景、未来、发展方向)
前言:new bing是基于chat-gpt的新搜索工具,可以采用对话方式进行问题搜索,经过排队等候终于可以使用new bing,询问了目前我最关心的关于android开发几个问题 文章目录1.如何学好android开发?2.android开发能做什么?3.…...
【C++】初识类和对象
🏖️作者:malloc不出对象 ⛺专栏:C的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、面向过程和面向对象初步认识二…...
EPICS S7nodave手册
第一章:介绍 本手册分为6章(不算次介绍部分)。第一章介绍s7nodave用于EPICS的设备支持的概念和特新。第二章描述启动一个使用s7nodave的IOC项目所需要的几步。第三章描述s7nodave支持的IOC shell命令。之后,第四章解释s7nodave支持的各种记录类型。最后…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
