当前位置: 首页 > 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支持的各种记录类型。最后…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...