【算法练习Day27】买卖股票的最佳时机 II跳跃游戏跳跃游戏 II

news2024/10/1 15:18:36

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 买卖股票的最佳时机 II
  • 跳跃游戏
  • 跳跃游戏 II
  • 总结:

买卖股票的最佳时机 II

122. 买卖股票的最佳时机 II - 力扣(LeetCode)
在这里插入图片描述

乍一看题目要求十分困难,求出总利润最高,要求是某一天买某一天卖,只能同时持有一支股票,但是可以在卖出后再其他时间再次购买彩票并卖出,这一点是十分重要的,这也间接的加大了难度。

解题思路是:我们可以将任意天数购买和卖出的等式简化为以下形式,例如我们购买该彩票的时间为第0天而在第3天时卖出,那么对于prices为数组名,有prices[3]-prices[0]=(prices[3]-prices[2])+(prices[2]-prices[1])+(prices[1]-prices[0])。这一等式可以将其看作为通式,它适用于任何天数的购买和卖出,都有售出价格减去购买价格等于其从卖出下标到购买下标方向上的左闭右闭区间相邻数的差再相加。这一结论可以用任意数组来模拟,都是正确的,起初看到这一方法觉得十分的神奇,后来想了一想由于是左闭右闭区间,相邻数做差再相加,那么说明我们的购买钱数和卖出钱数实际都参与了运算,此时我们将它们两个中间的数据作为一个整体,设购买钱数为x,卖出为y,那么很容易知道y-x=y-z+(z-x)。所以等式一定是成立的。我们根据这一特点,可以想到如果有一数组来表示给定数组prices中相邻两个数的差,那么将正数相加获得的答案自然就是买卖股票的最大利润。

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

知道了解题思路,不难写出以上代码,这里我们用result的重复判断来避免了新开数组的空间开辟,从而使代码变得简洁一些,实际上这和开辟一个数组存储相邻差,再取正数做和思路是相同的。

跳跃游戏

55. 跳跃游戏 - 力扣(LeetCode)
在这里插入图片描述

也是道没做过很难做的题目,思路是不要纠结于本次的前进究竟要走到哪一个位置,而是明确走的这一步它的最大范围能够覆盖到哪?如果覆盖范围能够包括最后一个位置,那么就返回true。而每一次的for以当前能够走到的最远距离作为判断的范围。

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cover=0;
        if(nums.size()==1)
        {
            return true;
        }
        for(int i=0;i<=cover;i++)
        {
            cover=max(i+nums[i],cover);
            if(cover>=nums.size()-1)
            {
                return true;
            }
        }
        return false;
    }
};

cover每次对当前数据进行比较,如果比现有范围大就赋值给它,判断部分的i<=cover在这里起的是什么作用呢?i每次都++如果cover所覆盖的范围都是0,那么就直接跳出循环了,每次它是用来约束i的,用来判断到底有没有可行的范围可以走,那有人问,如果是{2,0,1,0}怎么办呢?这就凸显出nums[i]+i的作用了,从当前下标开始最多能走到哪,所以加i是十分重要的,不能够缺少。

至于为什么cover>=nums.size()-1呢,是因为最后一个数下标是这个,所以我们判断覆盖范围大于或等于直接返回true了。

实际上这种方法是十分巧妙的,可以随意模拟数组将代码带入进行解析,这种cover赋值更大范围的思想,有效的帮助我们解决如果本次可以走的范围很多,那么到底走向哪里的问题,不用像递归思路那样走错了需要回溯走下一个位置,因为即使走错了,下一步的cover范围覆盖可以帮助我们修改,十分的巧妙。例如数组{2,0,1,2,1,3,0,1,0}比如说我们走到第二个2时候,如果是回溯思想可能就会先走第二个1试一试,不行再走3试一试,不过这里的cover会直接覆盖掉上个答案,也就是说他尽可能取得最大的步骤。

跳跃游戏 II

45. 跳跃游戏 II - 力扣(LeetCode)
在这里插入图片描述

跳跃游戏II和跳跃游戏的前部分思路是一致的,都是要确立覆盖的范围,而并非要一次确定好走哪一个下标处,不同的是,这道题目不仅要求要走到最后一个位置,还要求要使得走的步数最小。

这该怎么办呢?我们需要创建两个变量来存储能覆盖的范围,一个是当前的另一个是下一步能覆盖到的范围,那么我们如何知道当前这一步的范围内,下一步最远能走多远呢?答案是我们用循环变量i来控制,如果不停的更新next的最大值,当i等于当前的最大范围时,进入判断,把next值直接赋值给当前的最大范围,然后判断此范围是否包含最后一个数的下标,不包含接着循环这些步骤,直到到达。

class Solution {
public:
    int jump(vector<int>& nums) {
        if (nums.size() == 1) 
        {
            return 0;
        }
        int curDistance = 0;    // 当前覆盖最远距离下标
        int ans = 0;            // 记录走的最大步数
        int nextDistance = 0;   // 下一步覆盖最远距离下标
        for (int i = 0; i < nums.size(); i++) 
        {
            nextDistance = max(nums[i] + i, nextDistance);  // 更新下一步覆盖最远距离下标
            if (i == curDistance) 
            {                         // 遇到当前覆盖最远距离下标
                ans++;                                  // 需要走下一步
                curDistance = nextDistance;             // 更新当前覆盖最远距离下标(相当于加油了)
                if (nextDistance >= nums.size() - 1) 
                {
                    break;  // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束
                }
            }
        }
        return ans;
    }
};

我们把判断跳出的部分写在了第一个if判断的后面,这样可以避免一些时间的浪费,提高效率,不过理论上来上说,放进去也是可以的

总结:

今天我们完成了买卖股票的最佳时机 II、跳跃游戏、跳跃游戏 II三道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

智能视频监控平台EasyCVR接口调用注意事项汇总!

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

汽车4S店如何在数字化管理下,提高市场竞争力

在所有人都认为疫情过后&#xff0c;经济形势会一路向阳&#xff0c;但是&#xff0c;实际情况出乎所有人的意料&#xff0c;各行各业举步维艰。 新闻爆出的各大房地产&#xff0c;恒大的2.4万亿让人瞠目结舌&#xff0c;还有碧桂园和融创&#xff0c;也是债台高筑了&#xff…

Access denied for user ‘root‘@‘localhost‘ (using password:YES) 解决方案(禅道相关)

如果是忘记Mysql密码或更改权限后访问不了的问题请直接跳转以下链接&#xff1a; MySQL登录时出现Access denied for user ‘root‘‘localhost‘ (using password: YES)无法打开的解决方法 关于这个问题&#xff0c;网上查到的解决方法基本都是因为忘记Mysql密码或者用户权限问…

利用Jpom在线构建Spring Boot项目

1 简介 前面介绍了运用Jpom构建部署Vue项目&#xff0c;最近研究了怎么部署Spring Boot项目&#xff0c;至此&#xff0c;一套简单的前后端项目就搞定了。 2 基本步骤 因为就是一个简单的自研测试项目&#xff0c;所以构建没有使用docker容器&#xff0c;直接用java -jar命令…

Go语言入门心法(十三): 反射认知升维

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…

图像数据增强算法汇总(Python)

一、数据增强概述 数据增强是一种通过使用已有的训练样本数据来生成更多训练数据的方法&#xff0c;可以应用于解决数据不足的问题。数据增强技术可以用来提高模型的泛化能力&#xff0c;减少过拟合现象。比如在狗猫识别项目中&#xff0c;通过随机旋转、翻转和裁剪等数据增强…

什么是CDN?

目录 1.什么是CDN&#xff1f; 2.CDN工作原理 3.为什么要使用CDN&#xff1f; 4.CDN与传统网站访问的区别 5.CDN的应用场景 6.术语解释 1.什么是CDN&#xff1f; CDN英文全称Content Delivery Network&#xff0c;中文翻译即为内容分发网络。它是建立并覆盖在承载网之上…

【带头学C++】 ----- 1.基础知识 ---- 1.20 Typedef 为已有的类型取别名

1.20 Typedef 为已有的类型取别名 1.typedef语法格式 在 C 中&#xff0c;可以使用 typedef 关键字来为已有的类型创建一个别名。这对于提高代码可读性、简化类型声明以及增加代码的可维护性非常有用。 下面是 typedef 的语法格式&#xff1a; typedef 旧类型名 别名; 2.使…

Unity的碰撞检测

&#xff08;一&#xff09;测试前准备工作 1.创建两个游戏对象&#xff0c;分别取名为”Player”和”Enemy”&#xff0c;并且为名为”Player”的游戏对象设置Tag也为”Player”&#xff0c;二者在场景中如图1所示&#xff1a; 图1 绿为Enemy&#xff0c;红为Player 2.编写脚本…

《Linux从练气到飞升》No.22 Linux 进程间通信

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

kafka入门03——简单实战

目录 安装Java 安装Zookeeper 安装Kafka 生产与消费 主要是记录下Kafka的安装配置过程&#xff0c;前置条件需要安装jdk和zookeeper。 安装Java 1.Oracle官网下载对应jdk安装包 官网地址&#xff1a;Java Downloads | Oracle 好人分享了下载需要的oracle账号&#xff0c…

linux基本指令(Chapter 2)

linux基本指令(二) 1.date指令 语法:date [option] [format] date命令的作用是显示时间:使用date %Y:%m:%d可以指定格式显示时间.例如:(注意这里的和%之后不要有任何间隔)并且这里是加号,并不是减号 1.在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff0c;格式设…

NeRF综述

文章目录 《Nerf: Neural radiance field in 3d vision, a comprehensive review 》一、数据集&#xff1a;二、基于方法的分类&#xff08;Method-based Taxonomy&#xff09;三、基于应用的分类&#xff08;Application-based Taxonomy&#xff09;四、未来展望 《Nerf: Neur…

盘点网安最好入手的10大岗位,最高月薪30K!

前段时间&#xff0c;知名机构麦可思研究院发布了《2022年中国本科生就业报告》&#xff0c;其中详细列出近五年的本科绿牌专业&#xff0c;信息安全位列第一。 对于网络安全的发展与就业前景已经说过很多&#xff0c;它是收入较高的岗位之一&#xff0c;在转行领域也占据着热…

番外8.1 Task

---------系统中有两个账号&#xff0c;分别是alex与arod&#xff0c;这两个账号除了支持自己的组&#xff0c;还共同支持一个名为project的组。如这两个账号需要共同拥有/srv/ahome/目录的开发权&#xff0c;且该目录不允许其他账号进入查阅&#xff0c;请问该目录的权限应如何…

动手学深度学习—含并行连结的网络GoogLeNet(代码详解)

目录 1. Inception块3. GoogLeNet模型3. 训练模型 GoogLeNet吸收了NiN中串联网络的思想&#xff0c;并在此基础上做了改进&#xff0c;并且在2014年的ImageNet图像识别挑战赛中获得了不错的效果。 1. Inception块 GoogLeNet论文解决了多大的卷积核最合适的问题。 Inception块…

yolo数据增强,同时旋转txt标签文件

github https://github.com/vkdx/vkdx_cnn-.git YOLO格式txt文件分析 标注好的txt文件中有对应每个标注框的信息,从左到有分别是&#xff1a; class:类别 x_center&#xff1a;标注框中心相对于图像的x坐标 y_center&#xff1a;标注框中心相对于图像的y坐标 w&#xff1a;标…

Day09字符流缓冲流序列化流IO框架

字符流 FileReader&#xff08;文件字符输入流&#xff09; 使用文件字符输入流&#xff0c;有啥好处&#xff1f; 读取中文不会出现乱码问题 FileWriter(文件字符输出流) 利用字符流将一个文本文件复制到E:盘下&#xff0c;例如&#xff1a;D:/1.txt复制到E:/2.txt 请使用…

C语言每日一题(17)数组匹配

牛客网 BC156 牛牛的数组匹配 题目描述 描述 牛牛刚学会数组不久&#xff0c;他拿到两个数组 a 和 b&#xff0c;询问 b 的哪一段连续子数组之和与数组 a 之和最接近。 如果有多个子数组之和同样接近&#xff0c;输出起始点最靠左的数组。 输入描述&#xff1a; 第一行输…

如何在不损失质量的情况下调整图像大小

如何在不损失质量的情况下调整图像大小 如果您在线工作&#xff0c;就会知道图像质量对于呈现干净专业的外观有多么重要。 库存图像和免版税图像很容易找到&#xff0c;但是如何在不损失质量的情况下调整图像大小以使其适合您的目的&#xff1f; 无论您是想将图片用于博客文…