代码随想录算法训练营第32天 | 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II

买卖股票的最佳时机II

Alt

贪心思路

要想使用贪心算法解决此问题,意识到利润是可分解的很关键。比如[1,2,3,4,5]这个输入,最大利润为第一天买入,第五天卖出。这等效于第一天买入,第二天卖出,第二天再买入。。。
prices[4] - prices[0] = (prices[1] - prices[0]) + (prices[2] - prices[1]) + (prices[3] - prices[2]) + (prices[4] - prices[3])
所以总利润的最大值等于所有头天买第二天卖的正利润之和,局部最优组成了全局最优,可以用贪心算法。

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

动态规划思路

每一天的操作要么买入要么卖出,在该天要么持有股票,要么不持有股票。
dp[i][0]代表在第 i 天持有股票后的最大利润,dp[i][1]代表在第 i 天不持股的最大利润。

class Solution{
public:int maxProfit(vector<int>& prices){int n = prices.size();vector<vector<int>> dp(n, vector<int>(2, 0));dp[0][0] -= prices[0];for(int i = 1; i < n; i++){// 在第i - 1天持有股票的最大利润和第i - 1天没持股第i天买入之中选择最大值dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);// 在第i - 1天不持股的最大利润和第i - 1天持股第i天卖出之中选择最大值 dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);}return dp[n - 1][1];}
};

跳跃游戏

Alt
怎么跳不是问题,重点在于能跳的范围,范围内的每一点都能到达!
贪心算法局部最优解:每次取最大可跳步数,更新最远可跳范围。全局最优解:得到整体最远范围,看能否覆盖终点。

class Solution{
public:bool canJump(vector<int>& nums){int cover = 0;for(int i = 0; i <= cover; i++){  // 注意是小于等于能到达的范围cover = max(cover, i + nums[i]);if(cover >= nums.size() - 1)  return true;  // 如果能到达的范围已经覆盖了终点,返回true}return false;  // 到不了终点}
};

跳跃游戏II

Alt
与上一道题相似,也是通过跳跃的覆盖范围来判断是否需要走一步。贪心的局部最优策略是让当前可跳的覆盖范围尽量大,如果覆盖范围没到终点,步数就+1,全局最优就做到了以最小的步数增大覆盖范围。这道题需要统计两个覆盖范围,一个是当前这一步的最大覆盖和下一步的最大覆盖
如果下标到达了当前这一步的最大覆盖位置,还没到终点的话,那么就必须再走一步来增大覆盖范围,直到覆盖范围能覆盖终点。

class Solution{
public:int jump(vector<int>& nums){int result = 0;  // 统计步数if(nums.size() == 1)  return result;int curCover = 0;  // 当前步的最大覆盖int nextCover = 0;  // 下一步能达到的最大覆盖for(int i = 0; i < nums.size(); i++){nextCover = max(nextCover, i + nums[i]);  // 求下一步能到的最大覆盖范围if(i == curCover){  // 到达当前步的最大覆盖位置result++;  // 需要往前走一步curCover = nextCover;  // 更新覆盖范围if(curCover >= nums.size() - 1)  break;  // 如果新的覆盖范围已经覆盖了终点,结束循环// 避免在for循环中i=nums.size()-1 && i==curCover,又对result+1}}return result;}
};

代码可以再简洁一些,因为题目中说了给的数组是一定能跳到终点的。所以可以调整 for 循环的终止位置,只到nums.size() - 2即可。这样不会抵达终点,当抵达当前最大覆盖时,必须往前走一步,不需要另外判断下一步是否已经覆盖终点。

class Solution{
public:int jump(vector<int>& nums){int result = 0;if(nums.size() == 1)  return result;int curCover = 0;int nextCover = 0;for(int i = 0; i < nums.size() - 1; i++){nextCover = max(nextCover, i + nums[i]);if(i == curCover){  // 已经到达了当前的最大覆盖result++;curCover = nextCover;}}return result;}
};

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

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

相关文章

HCS-华为云Stack-FusionSphere

HCS-华为云Stack-FusionSphere FusionSphere是华为面向多行业客户推出的云操作系统解决方案。 FusionSphere基于开放的OpenStack架构&#xff0c;并针对企业云计算数据中心场景进行设计和优化&#xff0c;提供了强大的虚拟化功能和资源池管理能力、丰富的云基础服务组件和工具…

MYSQL基本查询(CURD:创建、读取、更新、删除)

文章目录 前言一、Create1.全列插入2.指定列插入3.插入否则更新4.替换 二、Retrieve1.SELECT列2.WHERE条件3.结果排序4.筛选分页结果 三、Update四、Delete1.删除数据2.截断表 五、插入查询结果六、聚合函数 前言 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型…

kali系统入侵电脑windows(win11系统)渗透测试,骇入电脑教学

本次渗透测试将使用kali虚拟机&#xff08;攻击机&#xff09;对本机&#xff08;靶机&#xff09;进行入侵并监控屏幕 声明&#xff1a;本篇仅仅是将本机作为靶机的一次简易渗透测试&#xff0c;实际情况中基本不可能出现如此简单的木马骇入&#xff08;往往在上传木马时就被防…

Android App开发-简单控件(4)——按钮触控和图像显示

3.4 按钮触控 本节介绍了按钮控件的常见用法&#xff0c;包括&#xff1a;如何设置大小写属性与点击属性&#xff0c;如何响应按钮的点击事件和长按事件&#xff0c;如何禁用按钮又该如何启用按钮&#xff0c;等等。 3.4.1 按钮控件Button 除了文本视图之外&#xff0c;按钮…

clickhouse 安装与入门(单节点安装)

1、简介 Clickhouse 是一个开源的面向联机分析处理&#xff08;OLAP, On-Line Analytical Processing&#xff09;的列式存储数据库管理系统。写入快、查询快&#xff0c;支持sql向量化、并行和分布式查询&#xff1b;但是不支持事务&#xff0c;不支持二级索引等。由俄罗斯的Y…

5_机械臂运动学基础_矩阵

上次说的向量空间是为矩阵服务的。 1、学科回顾 从科技实践中来的数学问题无非分为两类&#xff1a;一类是线性问题&#xff0c;一类是非线性问题。线性问题是研究最久、理论最完善的&#xff1b;而非线性问题则可以在一定基础上转化为线性问题求解。 线性变换&#xff1a; 数域…

【jetson笔记】解决vscode远程调试qt.qpa.xcb: could not connect to display报错

配置x11转发 jetson远程安装x11转发 安装Xming Xming下载 安装完成后打开安装目录C:\Program Files (x86)\Xming 用记事本打开X0.hosts文件&#xff0c;添加jetson IP地址 后续IP改变需要重新修改配置文件 localhost 192.168.107.57打开Xlaunch Win菜单搜索Xlaundch打开 一…

openssl3.2 - 测试程序的学习 - test\acvp_test.c

文章目录 openssl3.2 - 测试程序的学习 - test\acvp_test.c概述笔记要单步学习的测试函数备注END openssl3.2 - 测试程序的学习 - test\acvp_test.c 概述 openssl3.2 - 测试程序的学习 将test*.c 收集起来后, 就不准备看makefile和make test的日志参考了. 按照收集的.c, 按照…

【java面试】常见问题(超详细)

目录 一、java常见问题JDK和JRE的区别是什么&#xff1f;Java中的String类是可变的还是不可变的&#xff1f;Java中的equals方法和hashCode方法有什么关系&#xff1f;Java中什么是重载【Overloading】&#xff1f;什么是覆盖【Overriding】&#xff1f;它们有什么区别&#xf…

【计算机网络】概述|分层体系结构|OSI参考模型|TCP/IP参考模型|网络协议、层次、接口

目录 一、思维导图 二、计算机网络概述 1.计算机网络定义、组成、功能 2.计算机网络分类 3.计算机网络发展历史 &#xff08;1&#xff09;计算机网络发展历史1&#xff1a;ARPANET->互联网 &#xff08;2&#xff09;计算机网络发展历史2&#xff1a;三级结构因特网 …

【JavaWeb】日程管理系统 添加过滤器登录校验 第三期

文章目录 过滤器控制登录校验创建过滤器类修改login原业务方法 总结 过滤器控制登录校验 未添加过滤器 可以直接访问 showShedule.html 需求说明: 未登录状态下不允许访问showShedule.html和SysScheduleController相关增删改处理,重定向到login.html,登录成功后可以自由访问 创…

RabbitMQ进阶篇【理解➕应用】

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于RabbitMQ的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一.什么是交换机 1.概念释义 2.例…

web前端-------伪类和伪元素

但是&#xff0c;网页中一些特殊的样式&#xff0c;需要用到特殊的CSS选择器来设置。&#xfeff;在CSS中&#xff0c;我们把这类选择器称为伪选择器。 伪选择器&#xff0c;分为伪类选择&#xfeff;器和伪元素选择器两个大类。 伪类选择器&#xff0c;简称伪类&#xff1b;…

【贪吃蛇:C语言实现】

文章目录 前言1.了解Win32API相关知识1.1什么是Win32API1.2设置控制台的大小、名称1.3控制台上的光标1.4 GetStdHandle&#xff08;获得控制台信息&#xff09;1.5 SetConsoleCursorPosition&#xff08;设置光标位置&#xff09;1.6 GetConsoleCursorInfo&#xff08;获得光标…

【DeepLearning-8】MobileViT模块配置

完整代码&#xff1a; import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

接口测试入门,如何划分接口文档

1.首先最主要的就是要分析接口测试文档&#xff0c;每一个公司的测试文档都是不一样的。具体的就要根据自己公司的接口而定&#xff0c;里面缺少的内容自己需要与开发进行确认。 我认为一针对于测试而言的主要的接口测试文档应该包含的内容分为以下几个方面。 a.具体的一个业…

一文深度解读多模态大模型视频检索技术的实现与使用

当视频检索叠上大模型Buff。 万乐乐&#xff5c;技术作者 视频检索&#xff0c;俗称“找片儿”&#xff0c;即通过输入一段文本&#xff0c;找出最符合该文本描述的视频。 随着视频社会化趋势以及各类视频平台的快速兴起与发展&#xff0c;「视频检索」越来越成为用户和视频平…

JVM/GC复习

JVM/GC JVM(java虚拟机)MATjstack(将正在运行的JVM的线程进行快照并且打印出来)死锁VisualVM工具(监控线程内存使用情况)JMX分析堆日志什么情况下可能需要JVM调优补充JVM内部结构JVM 调优策略(补充) GC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法…

NQA测试机制—UDP Jitter测试

概念 UDP Jitter是以UDP报文为承载&#xff0c;通过记录在报文中的时间戳信息来统计时延、抖动、丢包的一种测试方法。Jitter&#xff08;抖动时间&#xff09;是指相邻两个报文的接收时间间隔减去这两个报文的发送时间间隔。 UDP Jitter测试的过程如下&#xff1a; 1. 源端&a…

ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连

用了网上的办法&#xff1a; 1、修改listener.ora的参数,把动态的参数设置为静态的参数,红色标注部分 位置D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME PLSExtProc) (ORACLE_HOME D:\oracle\produ…