【Leetcode每日一刷】贪心算法|122.买卖股票的最佳时机 II、55. 跳跃游戏

一、122.买卖股票的最佳时机 II

力扣题目链接
在这里插入图片描述

🦄解题思路:

首先需要明确的几个点:

  • 当前只能有最大一支股票
  • 每一天操作只能3选1:买or卖or休息

此外,对于贪心,总有像下面图示的一种直觉:如果后一天比今天高,则买,否则不买;这是正确的直觉:
在这里插入图片描述
那么这里可能想给出这样的一个思路:

  • 若当前元素的价格低于后面元素,则买入,并在后面一个元素卖出:相当于:确定了,今天买,必须明天卖;如此遍历。
  • 若当前元素的价格高于后面元素,则当前元素不动,即休息一天。

没错,很有道理,但是我想到了一个反例:
如下图,如果按照上面的思路,则第一个元素买入,第二个元素卖出;遍历到第二个元素时,由于已经卖出,按理来说不能再操作了,但是由于当前元素低于第三个元素,还应该买下第二个元素,这样似乎违法了每天只能有一个操作的前提。
在这里插入图片描述
但是后来看了一些题解,发现这种情况根本不影响,虽然正确情况的:第 0 天买入,第 2 天卖出,那么利润为:prices[2] - prices[0]。相当于 (prices[2] - prices[1]) + (prices[1] - prices[0])。也正是由于这种情况,也就是说,计算过程并不等同于实际交易过程,但是计算买卖利润的总和的结果(prices[2] - prices[1]) + (prices[1] - prices[0]),和实际交易情况prices[2] - prices[0]的结果一致,这也是为什么可以这么算!

而且还要发现一点的是,买和卖总是一个单位,它们之间可能有“休息”,像上图一样,但是分解过后,还是两天“买”和“卖”为一个单元。只有这样才能获得最大利润。

在这里插入图片描述

所以这题还是一个比较偏直觉的,一开始可能会像我一样,死磕在当前这一天的操作上(一天操作只能三选一),从而无法下手。

所以具体算法过程如下,贪心贪的就是收集所有正项:

在这里插入图片描述

贪心算法和动态规划相比,它既不看前面(也就是说它不需要从前面的状态转移过来),也不看后面(无后效性,后面的选择不会对前面的选择有影响),因此贪心算法时间复杂度一般是线性的,空间复杂度是常数级别的;

✅正确代码:

class Solution {
public:int maxProfit(vector<int>& prices) {int res = 0;for (int i = 1; i < prices.size(); i++){res += max(prices[i]-prices[i-1],0);}return res;}
};

二、55. 跳跃游戏

力扣题目链接
在这里插入图片描述
🦄解题思路:

我个人在做这题时并没有做出来,而是陷入了两个思维误区:

  • 总是在想,比如当前位于元素值为3的位置,我是走1步还是走2步呢?还是3步呢?
  • 好像有点像动态规划的跳楼梯?但是似乎不能从后往前推?状态方程很难确定

其实这题还是贪心,而且它根本不拘泥与到底跳多少步,而是你能跳到哪?或者说你最远能跳到哪里!你跳跃的覆盖范围!为什么这么说呢,可以看下面的图解:

在这里插入图片描述
所以这题的coding核心如下

  • cover变量,实时记录和更新当前cover的最远距离
  • for循环逐个遍历数组元素,更新cover(注意for循环的边界

❌错误代码和分析1:

class Solution {
public:bool canJump(vector<int>& nums) {int cover = 0;//表示当前覆盖长度for (int i = 0; i < nums.size() - 1; i++){cover = max(i+1+nums[i],cover);}return cover >= nums.size()? true : false;}
};
  • 没有考虑只有一个元素:
    在这里插入图片描述

❌错误代码和分析2:

class Solution {
public:bool canJump(vector<int>& nums) {int cover = 0;//表示当前覆盖长度if (nums.size() == 1) return true; // 只有一个元素,就是能达到for (int i = 0; i < nums.size() - 1; i++){cover = max(i+1+nums[i],cover);}return cover >= nums.size()? true : false;}
};
  • for循环边界不是nums.size()-1而是cover!指到这个元素,确定范围cover,起码你要能到这个元素吧。遍历都是要遍历能到达的元素(也就是cover内的,即使cover是随时更新的)。比如这个第一个元素是0,那么你都到不了第二个元素;
    在这里插入图片描述

✅正确代码:

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

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

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

相关文章

力扣SQL50 产品销售分析 I 查询

Problem: 1068. 产品销售分析 I 思路 left join on&#xff1a;左连接 Code select p.product_name, s.year, s.price from Sales s left join Product p on s.product_id p.product_id

靠谱的车【华为OD机试-JAVAPythonC++JS】

题目描述 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xff0c;总是偏大。 出租车司机解释说他不喜欢数字4&#xff0c;所以改装了计费表&#xff0c;任何数字位置遇到数字4就直接跳过&#xff0c;其余功能都正常。 比如&…

Scaffold 脚手架

Scaffold 脚手架 Scaffold 脚手架组件是一个核心组件&#xff0c;它为开发者提供了一个标准的、可定制的应用界面框架。androidx.compose.material3.Scaffold 包含了应用界面的基础元素&#xff0c;如状态栏、导航栏、顶部应用栏&#xff08;TopAppBar&#xff09;等。通过 Sc…

Windows的Docker-Desktop安装与问题总结

目录 Docker-Desktop安装步骤 环境配置 Docker-Desktop安装问题总结 问题1&#xff1a;docker-desktop setting界面一直加载转圈 问题2&#xff1a;docker镜像的存储位置变更&#xff08;防止C盘空间不足&#xff09; 参考文献&#xff1a; Docker-Desktop安装步骤 环境…

又挖到宝了!国人团队研发的AI视频工具PixVerse,这么好用居然还完全免费!(强烈推荐)

昨天发了一款国产免费的 AI 绘画工具 Dreamina 的介绍&#xff1a; 居然才发现&#xff01;字节跳动旗下国产AI绘画工具Dreamina&#xff0c;这么好用居然还免费&#xff01;&#xff08;强烈推荐&#xff09; 发现大家对国产 AI 工具还挺感兴趣的。今天继续帮大家挖国产的 A…

【Leetcode每日一题】二分查找 - 山脉数组的峰顶索引(难度⭐⭐)(23)

1. 题目解析 Leetcode链接&#xff1a;852. 山脉数组的峰顶索引 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于找到题目中所说的峰值所在的下标并返回他们的下标即可。 2. 算法原理 峰顶及两侧数据特点分析 峰顶数据…

运算放大电路常用接法

1、反相比例运算电路 2、同相比例运算电路 3、电压跟随器 4、反相求和运算电路 5、同相求和运算电路 6、加减运算电路 7、加减电路 8、积分运算电路 9、实用积分电路 10、微分运算电路 11、实用微分电路 12、压控电压源二阶低通滤波器 13、压控电压源二阶高通滤波器 14、RC桥式…

[剪藏] - 尊湃通讯公司窃密曝光,发现绕不过华为

在科技领域风起云涌的今天&#xff0c;一场惊心动魄的窃密事件悄然发生&#xff0c;涉及华为WIFI6芯片技术的商业秘密被窃取&#xff0c;案中主谋竟然是一位曾在华为海思拥有重量级地位的技术大佬。本文将深入挖掘这起事件的来龙去脉&#xff0c;探讨窃密者的背叛和华为的技术守…

公钥密码体制

公钥密码体制 一个系统中,n个用户之间要进行保密通信,为了确保安全性,两两用户之间的密钥不能一样。这种方式下,需要系统提供C2 n=n(n-1)/2把共享密钥。这样密钥的数量就大幅增加了,随之而来的产生、存储、分配、管理密钥的成本也大幅增加。而使用公钥密码体制可以大大减…

深度学习-回顾经典AlexNet网络:山高我为峰

深度学习-回顾经典AlexNet网络之山高我为峰 深度学习中&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;它们把AI技术不断推向高潮。2012年AlexNet大放异彩&#xff0c;它把深度学习技术引领第一个高峰&#x…

总结一下linux性能检测和调优手段

1.perf 是 Linux 系统中性能分析工具&#xff0c;用于收集性能相关的信息。它可以用于查看 CPU 使用情况、内存性能、磁盘 I/O 等&#xff0c;以帮助开发者找到性能瓶颈。 以下是一些 perf 常见用法和示例&#xff1a; 1. CPU Profiling a. 查看 CPU 使用率 perf stat -e cpu…

10分钟SkyWalking与SpringBoot融合并整合到Linux中

1.依赖配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.0.RELEASE</version></dependency><dependency><groupId>org.springframe…

从模型到复合AI系统的转变

2023年,大型语言模型(LLM)吸引了所有人的注意力,它可以通过提示来执行通用任务,例如翻译或编码。这自然导致人们将模型作为AI应用开发的主要成分而密切关注,所有人都在想新的LLM将带来什么能力。然而,随着越来越多的开发者开始使用LLM构建,我们认为这种关注正在迅速改变:最先进…

数据服务安全的重要性

数据服务安全在当今信息化社会显得尤为重要。随着大数据、云计算、人工智能等技术的飞速发展&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;数据服务安全也面临着前所未有的挑战。本文将从数据服务安全的重要性、常见威胁、防护策略以及未来发展趋势等方面进行探讨…

selenuim【1】($x(‘xpath语法’)、WebDriverWait())

文章目录 初学selenuim记录1、执行driver webdriver.Chrome()后很久才打开浏览器2、浏览器多元素定位 $x(‘xpath语法’)3、打开浏览器driver.get("网址")执行了很久才开始定位元素&#xff1a;等待&#xff08;1&#xff09;driver.set_page_load_timeout(t)&#…

外包干了7个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入北京某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

智慧旅游+数字化景区整体解决方案:文件全文83页,附下载

关键词&#xff1a;智慧景区建设&#xff0c;智慧旅游一体化平台&#xff0c;数字化景区建设&#xff0c;智慧旅游建设&#xff0c;智慧景区解决方案&#xff0c;智慧文旅解决方案&#xff0c;智慧旅游解决方案 一、景区智慧旅游建设需求与背景分析 1、技术发展背景 随着信息…

Unity | Shader基础知识(第十集:shader常用外部资产单词速成)

目录 一、外部资产简介 二、常用的外部资产单词 三、常用的外部资产单词和引入内部 四、图片资产外部调整的具体讲解 1.Tiling&#xff0c;中文&#xff1a;铺地砖 2.Offset&#xff0c;中文&#xff1a;偏移 五、作者的话 一、外部资产简介 在第六集中&#xff0c;我们…

RabbitMQ的常见工作模式

Work queues 工作队列模式 模式说明 通过Helloworld工程我们已经能够构建一个简单的消息队列的基本项目&#xff0c;项目中存在几个角色:生产 者、消费者、队列&#xff0c;而对于我们真实的开发中 &#xff0c;对于消息的消费者通过是有多个的。 比如在实现用户注册功能时&…

【OpenCV】绘制桌面锁屏时钟

OpenCV 是一个开源的计算机视觉&#xff08;Computer Vision&#xff09;与机器学习软件库&#xff0c;提供了多种图像处理算法与接口&#xff0c;用于解决计算机视觉相关问题。OpenCV 支持多平台与多语言&#xff0c;本文主要记录如何使用 OpenCV-Python 绘制桌面锁屏时钟。 目…