【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.hqwc.cn/news/502385.html

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

相关文章

2024年3月2日 十二生肖 今日运势

小运播报&#xff1a;2024年3月2日&#xff0c;星期六&#xff0c;农历正月廿二 &#xff08;甲辰年丙寅月乙丑日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;鸡、蛇、鼠 需要注意&#xff1a;狗、马、羊 喜神方位&#xff1a;西北方 财神方位&#xff1a;东…

bert 相似度任务训练,简单版本

目录 任务 代码 train.py predit.py 数据 任务 使用 bert-base-chinese 训练相似度任务&#xff0c;参考&#xff1a;微调BERT模型实现相似性判断 - 知乎 参考他上面代码&#xff0c;他使用的是 BertForNextSentencePrediction 模型&#xff0c;BertForNextSentencePred…

AI也来打掼蛋,难道人工智能也能当领导?

引言&#xff1a;探索AI在复杂卡牌游戏中的决策能力 在人工智能&#xff08;AI&#xff09;的研究领域中&#xff0c;游戏被视为现实世界的简化模型&#xff0c;常常是研究的首选平台。这些研究主要关注游戏代理的决策过程。例如&#xff0c;中国的传统卡牌游戏“掼蛋”&#…

Windows Docker 部署 Jenkins

一、简介 今天介绍一下在 Windows Docker 中部署 Jenkins 软件。在 Windows Docker 中&#xff0c;分为两种情况 Linux 容器和 Windows 容器。Linux 容器是通常大多数使用的方式&#xff0c;Windows 容器用于 CI/CD 依赖 Windows 环境的情况。 二、Linux 容器 Linux 容器内部…

LeetCode -- 79.单词搜索

1. 问题描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水…

【前沿热点视觉算法|Sora|GPT4一键升级】一种新的图像分割方法:具有边界注意的两级解码网络

计算机视觉算法分享。问题或建议&#xff0c;请文章私信或者文章末尾扫码加微信留言。sora 具体介绍和使用方法&#xff1a;OpenAI Sora 下一代生产力&#xff1a;最新小白必看教程 | 解剖Sora的前世今生 | Sora核心源码目前 openai 官方还未开放 sora 灰度&#xff0c;不过根据…

黑马JavaWeb课程中安装vue脚手架出现的问题

1 安装node.js 要想前端工程化&#xff0c;必须安装node.js&#xff0c;前端工程化的环境。 在成功安装node.js后&#xff0c; 修改全局包安装路径为Node.js安装目录&#xff0c; 修改npm镜像源为淘宝镜像源&#xff0c;这里出现第一个问题&#xff0c;视频中给的淘宝镜像为&…

抽象类、模板方法模式

抽象类概述 在Java中abstract是抽象的意思&#xff0c;如果一个类中的某个方法的具体实现不能确定&#xff0c;就可以申明成abstract修饰的抽象方法&#xff08;不能写方法体了&#xff09;&#xff0c;这个类必须用abstract修饰&#xff0c;被称为抽象类。 抽象方法定义&…

WSL2编译RV1126 SDK

接上一篇《WSL2部署RV1126 SDK编译环境》 1 编译配置 ./build.sh device/rockchip/rv1126_rv1109/aio-rv1126-jd4.mk 2 关闭Qt&#xff08;可选&#xff09; vim buildroot/configs/firefly_rv1126_rv1109_defconfig 3 启用ROS&#xff08;可选&#xff09; vim buildroot/conf…

链表基础知识详解(非常详细简单易懂)

概述&#xff1a; 链表作为 C 语言中一种基础的数据结构&#xff0c;在平时写程序的时候用的并不多&#xff0c;但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛&#xff0c;所以必须要搞懂链表&#xff0c;链表分为单向链表和双向链表&#xff0c;单向链表很…

Rocky Linux 安装部署 Zabbix 6.4

一、Zabbix的简介 Zabbix是一种开源的企业级监控解决方案&#xff0c;用于实时监测服务器、网络设备和应用程序的性能和可用性。它提供了强大的数据收集、处理和可视化功能&#xff0c;同时支持事件触发、报警通知和自动化任务等功能。Zabbix易于安装和配置&#xff0c;支持跨平…

HTTPS是什么,详解它的加密过程

目录 1.前言 2.两种加密解密方式 2.1对称加密 2.2非对称加密 3.HTTPS的加密过程 3.1针对明文的对称加密 3.2针对密钥的非对称加密 3.3证书的作用 1.前言 我们知道HTTP协议是超文本传输协议,它被广泛的应用在客户端服务器上,用来传输文字,图片,视频,js,html等.但是这种传…