当前位置: 首页 > news >正文

【算法练习Day42】买卖股票的最佳时机 III买卖股票的最佳时机 IV

在这里插入图片描述

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

文章目录

  • 买卖股票的最佳时机 III
  • 买卖股票的最佳时机 IV
  • 总结:

今天这期依旧是买卖股票的专题,两道题难度都是困难,建议先看上一期的文章,搞懂买卖股票的最佳时机I和II再来看本章,可能会更加容易理解题解。

买卖股票的最佳时机 III

123. 买卖股票的最佳时机 III - 力扣(LeetCode)

买卖股票的最佳时机III实际上是I和II的拼凑版本。只能买卖最多两次的含义是,可以买卖一次或者两次,并不是说一定要买卖两次,我们最后取得的答案是买卖一次和买卖两次的最大利润,但其实最终利润如果是买卖一次大,那么买卖第二次时候利润最终会与第一次是相等的数值,这个放在后面说。

dp数组的含义,以及遍历顺序与之前的那期两道题是一样的,只是dp数组的含义得到了扩展,0代表第一次买1代表第一次卖,2代表第二次买,3代表第二次卖,仅此而已。

递推公式:递推公式一共有四个,代表了买卖的第一次和第二次。为什么说它是上一期两道题的结合版本,是因为买卖的第一次我们用到的是I的递推公式,而买卖第二次就是用的II的递推公式!买卖同样的是代表了状态,而不是当天一定买如股票卖出股票,它也可以是以前买入的。简单的再说一次,第一次买股票的递推公式是前一天的拥有的钱和在今天如果买了股票拥有的钱做对比,哪个大取哪个,第一次卖是前一天卖出后的拥有的钱,和如果前一天已经持有股票的话,今天卖了会拥有的利润,取最大值。第二次买卖也是一样不多说了。直接给出四个递推公式。

dp[i][0]=max(dp[i-1][0],-prices[i]);dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);

dp[i][2]=max(dp[i-1][2],dp[i-1][1]-prices[i]);dp[i][3]=max(dp[i-1][3],dp[i-1][2]+prices[i]);

dp数组的初始化:直接看初始化我们可以知道,第一次买卖再第一天我们都已经分析过了买应该是-prices【i】,因为我们是假设的刚开始手上没有钱初始值是0,不懂得看上一期的文章,卖获得的是0,同一天买卖不赚钱。那第二次买卖我们该如何初始化?我们不妨假设给的数组只有一个数据,也就是只能在第一天买卖,要是这样的想的话,我们第一次卖了之后手里钱和第一次买股票时候钱是一样的,都是0,那么第二次买股票也初始化为-prices【i】,第二次卖也是0。

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

这就是这道题的代码了,思路还是比较清晰的,代码也不是十分复杂,但是要想到怎么解,没有做过还是很难的。最后我们来说前面提到的,为什么如果第一次买卖的利润大于第二次买卖,那么第二次买卖到最后也会变成第一次买卖的利润数呢?其实这一点也很好解释,和上一起的第二道题是一样的,我们的从第一个递推公式往后的每一个递推公式都和上一个递推公式有牵连,也就是说这些地推公式里的值,不仅依赖于自己本身的值,也依赖于上一个递推公式所推算出来的最大利润值。所以也就是说各个递推公式一层影响着下一层,最后到了最后一个递推公式,它所推出来的最大利润就一定是两次中的最大利润。

买卖股票的最佳时机 IV

188. 买卖股票的最佳时机 IV - 力扣(LeetCode)

这道题算上是上一道题的进阶版本,最多可以交易几次,是由函数传值影响,并不是直接固定的数值,那么我们还能像上一道题一样手动列出有递推公式吗?其实我们可以借助于循环,帮助我们列出对应数量的递推公式,一共可以买卖k次,那么一定得列出2*k个递推公式,因为买卖是两个公式。这道题与上一道不同的是,这道题我们需要列一个什么都不做的操作,来使递推公式能够模拟第一次买入的时候也可以像其他时候买入那样具有泛型的规律。这样说起来可能太抽象了,在后面读者可以自行感悟。

dp数组含义:二维部分是需要2*k+1个这么大的空间。且含义与之前相同。

递推公式:由于我们是借助循环来模拟列出各个递推公式,而每一次买卖需要两个递推公式,那么很显然我们只需列出两个递推公式让它们循环k次就可以了。

两个递推公式分别是:

dp[i][j+1]=max(dp[i-1][j+1],dp[i-1][j]-prices[i]);
dp[i][j+2]=max(dp[i-1][j+2],dp[i-1][j+1]+prices[i]);

对上面两个递推公式做一个简单的解释,为什么是j+1,和j+2,而j又是什么呢?j其实是用来模拟第几次买卖的变量,j从0开始走,我们已经说过了,前面空出来一位不做操作,所以j+1模拟第一次买入,j+2模拟第一次卖出,这样就使得第一次买股票也有规律可循,dp【i】【0】实际上就是为了占位的,它被初始化为0。方便了第一次的买入。j每次向后走两位。

初始化:初始化和上面的一样,也是买入初始化为-prices【i】,卖出初始化为0。只不过我们这里在创建数组时候,将各个位置初始为0之后,应该再用for循环把买入股票再初始化一次。关于这里为什么总要把买股票初始化为-prices【i】,不懂得也可以去看上一期文章,买股票最开始假设的是起初拥有现金0元,如果不初始化一下的话,就会导致一直为0,不买入股票。

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

以上就是本文章的全部内容,两道题都是困难难度的题,但是明白的思路会发现其实并没有那么难。

总结:

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

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

在这里插入图片描述

相关文章:

【算法练习Day42】买卖股票的最佳时机 III买卖股票的最佳时机 IV

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 买卖股票的最佳时机 III买卖…...

苹果手机如何备份通讯录?看完这篇就懂了!

如果遇到手机丢失或者出现故障的情况&#xff0c;通讯录备份可以避免联系人信息丢失。另外&#xff0c;当用户更换手机或者进行数据迁移时&#xff0c;提前备份好的通讯录数据可以快速还原到新设备上&#xff0c;避免了手动输入联系人的麻烦。苹果手机如何备份通讯录&#xff1…...

[yarn]yarn异常

一、运行一下算圆周率的测试代码&#xff0c;看下报错 cd /home/data_warehouse/module/hadoop-3.1.3/share/hadoop/mapreduce hadoop jar hadoop-mapreduce-examples-3.1.3.jar pi 1000 1000 后面2个数字参数的含义&#xff1a; 第1个1000指的是要运行1000次map任务 …...

C++ NULL 与nullptr 区别

在编写C程序的时候只看到过NULL&#xff0c;而在C的编程中&#xff0c;我们可以看到NULL和nullptr两种关键字&#xff0c;其实nullptr是C11版本中新加入的&#xff0c;它的出现是为了解决NULL表示空指针在C中具有二义性的问题。 一、C程序中的NULL 在C语言中&#xff0c;NULL…...

Google Chrome 浏览器 119.0.6045.106 版本提示 STATUS_INVALID_IMAGE_HASH 崩溃

问题 今天更新 Google Chrome 浏览器到 119.0.6045.106 版本&#xff0c;然后访问页面不是空白&#xff0c;就是页面崩溃了 解决方案 我在网上找了几种&#xff0c;下面这个方式符合&#xff0c;能解决我的问题&#xff0c;就是在快捷方式的属性那里&#xff0c;找到目标给它…...

网络IO

网络IO 阻塞模型 在之前网络通信都是阻塞模型 客户端向服务端发出请求后&#xff0c;客户端会一直处于等待状态&#xff0c;直到服务器端返回结果或网络出现问题 服务器端也是如此&#xff0c;在处理某个客户端A发来的请求时&#xff0c;另一个客户端B发来的请求会等待&#xf…...

数据库管理-第115期 too many open files(202301107)

数据库管理-第115期 too many open files&#xff08;202301107&#xff09; 这是我上周末帮朋友站台过程中处理的一个问题。 1 背景 其实这是别人搭的一个使用CentOS 7.8系统安装的一套11.2.0.4&#xff08;无补丁&#xff09;的双节点RAC&#xff0c;用于迁移以前运行在So…...

一行命令让你的服务器命令行亮起来!!!!

if [ "$(whoami)" "root" ]; then echo "PS1${debian_chroot:($debian_chroot)}\[\033[01;32m\]\u\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]# " >> /root/.bashrc; source /root/.bashrc; echo "已为root用户设置提示符以#结尾…...

线性代数(二)| 行列式性质 求值 特殊行列式 加边法 归纳法等多种方法

文章目录 1. 性质1.1 重要性质梳理1.1.1 转置和初等变换1.1.2加法行列式可拆分1.1.3 乘积行列式可拆分 1.2 行列式性质的应用1.2.1 简化运算1.2.2 将行列式转换为&#xff08;二&#xff09;中的特殊行列式 2 特殊行列式2.1 上三角或下三角行列式2.2 三叉行列式2.3 行列式行和&…...

OpenCV入门7:图像形态学变换

形态学是一种针对图像形状和结构进行操作和分析的图像处理方法。在OpenCV中&#xff0c;提供了一些函数和方法用于执行形态学操作。下面将介绍一些常见的形态学操作及其在OpenCV中的实现方式。 膨胀&#xff08;Dilation&#xff09;&#xff1a; 膨胀操作可以扩展图像中的边…...

Apache Storm 2.5.0 集群安装与配置

1、下载Apache Storm 2.5.0 https://mirrors.tuna.tsinghua.edu.cn/apache/storm/apache-storm-2.5.0/ 2、准备3台服务器 192.168.42.139 node1 192.168.42.140 node1 192.168.42.141 node2 3、配置host [rootnode1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost…...

Android-将编码的base64图像,添加水印,转换成File存储到手机

一、将图片file转换成bitmap Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 二、给图片添加水印 String[] content = new String[]{"纬度:" + latitude, "经度:" + longitude, "地址:" + signAddress, "时间:&…...

AI 绘画 | Stable Diffusion 图生图

图生图简介 Stable Diffusion 不仅可以文生图&#xff0c;还可以图生图。文生图就是完全用提示词文本去生成我们想要图片&#xff0c;但是很多时候会有词不达意的感觉。就像我们房子装修一样&#xff0c;我们只是通过文字描述很难表达出准确的想要的装修效果&#xff0c;如果能…...

Nat. Med. | 基于遗传学原发部位未知癌症的分类和治疗反应预测

今天为大家介绍的是来自Alexander Gusev团队的一篇论文。原发部位未知癌症&#xff08;Cancer of unknown primary&#xff0c;CUP&#xff09;是一种无法追溯到其原发部位的癌症&#xff0c;占所有癌症的3-5&#xff05;。CUP缺乏已建立的靶向治疗方法&#xff0c;导致普遍预后…...

RocketMQ如何安全的批量发送消息❓

优点&#xff1a; 批量发送消息可以提高rocketmq的生产者性能和吞吐量。 使用场景: 发送大量小型消息时&#xff1b;需要降低消息发送延迟时&#xff1b;需要提高生产者性能时&#xff1b; 注意事项&#xff1a; 消息列表的大小不能超过broker设置的最大消息大小;消息列表…...

计算机视觉与深度学习 | 基于视觉惯性紧耦合的SLAM后端优化算法

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 基于视觉惯性紧耦合的SLAM后端优化算法 引言视觉惯性联合初始化非线性优…...

GDI+ 绘制透明图

目录 一、GDI+ 准备工作 1、线程中添加GDI+支持 2、Gdiplus::Bitmap 1)、从文件创建位图...

【Java】IntelliJ IDEA使用JDBC连接MySQL数据库并写入数据

目录 0 准备工作1 创建Java项目2 添加JDBC 驱动程序3 创建数据库连接配置文件4 创建一个 Java 类来连接和操作数据库5 运行应用程序 在 IntelliJ IDEA 中连接 MySQL 数据库并将数据存储在数据表中&#xff0c;使用 Java 和 JDBC&#xff08;Java Database Connectivity&#xf…...

Linux Hadoop平台伪分布式安装

Linux Hadoop 伪分布式安装 1. JDK2. Hadoop3. MysqlHive3.1 Mysql8安装3.2 Hive安装 4. Spark4.1 Maven安装4.2 Scala安装4.3 Spark编译并安装 5. Zookeeper6. HBase 版本概要&#xff1a; jdk&#xff1a; jdk-8u391-linux-x64.tar.gzhadoop&#xff1a;hadoop-3.3.1.tar.gzh…...

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX 手动添加、库添加方式

STM32-DSP库的使用 一.CMSIS-DSP1.1 DSP库简介1.2 支持的函数类别1.3 宏定义 二、操作2.1 STM32CubeMX 配置基本工程2.2 Lib库的方式实现(推荐)2.3 手动添加DSP文件&#xff08;可以下载官方最新库&#xff0c;功能齐全&#xff09; 三、MFCC测试DSP加速效果 为验证语音识别MFC…...

3大核心功能:ChanlunX缠论插件让技术分析自动化

3大核心功能&#xff1a;ChanlunX缠论插件让技术分析自动化 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX ChanlunX缠论插件是一款专为通达信软件设计的缠论分析工具&#xff0c;通过自动化算法实现缠论…...

揭秘内存稳定性:Memtest86+深度解析与实战指南

揭秘内存稳定性&#xff1a;Memtest86深度解析与实战指南 【免费下载链接】memtest86plus Official repo for Memtest86 项目地址: https://gitcode.com/gh_mirrors/me/memtest86plus 当系统频繁崩溃、数据无故损坏&#xff0c;或是新硬件安装后出现难以解释的错误时&am…...

从GUI点击到脚本一键流:用dc_shell -topo模式搞定DC综合全流程(含Lab1完整TCL脚本分析)

从GUI点击到脚本一键流&#xff1a;用dc_shell -topo模式搞定DC综合全流程&#xff08;含Lab1完整TCL脚本分析&#xff09; 在数字芯片设计领域&#xff0c;Design Compiler&#xff08;DC&#xff09;作为Synopsys公司推出的逻辑综合工具&#xff0c;一直是RTL到门级网表转换的…...

RWKV7-1.5B-world惊艳效果:输入‘请用中英双语介绍RWKV7-1.5B-world模型‘→完美执行

RWKV7-1.5B-world惊艳效果&#xff1a;输入请用中英双语介绍RWKV7-1.5B-world模型→完美执行 1. 模型概览 RWKV7-1.5B-world是基于第7代RWKV架构的轻量级双语对话模型&#xff0c;拥有15亿参数。这个模型采用了一种创新的线性注意力机制&#xff0c;替代了传统Transformer的自…...

Flutter定位权限处理全攻略:从用户拒绝到后台持续追踪的完整流程

Flutter定位权限处理全攻略&#xff1a;从用户拒绝到后台持续追踪的完整流程 在移动应用开发中&#xff0c;位置服务已经成为增强用户体验的核心功能之一。无论是外卖应用的配送跟踪、社交应用的附近好友推荐&#xff0c;还是健身应用的运动轨迹记录&#xff0c;精准的位置数据…...

Jasminum终极指南:3步解决Zotero中文文献管理的核心痛点

Jasminum终极指南&#xff1a;3步解决Zotero中文文献管理的核心痛点 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 你是否曾为中…...

Wan2.2-I2V-A14B风格迁移应用:将输入文本映射至特定艺术家视觉风格

Wan2.2-I2V-A14B风格迁移应用&#xff1a;将输入文本映射至特定艺术家视觉风格 1. 镜像概述与核心能力 Wan2.2-I2V-A14B是一款专为艺术风格视频生成设计的私有部署镜像&#xff0c;能够将文本描述转化为具有特定艺术家风格的动态视频作品。这个镜像经过深度优化&#xff0c;特…...

数据科学家成长路线图:从零到一构建核心技能与项目实战

1. 项目概述&#xff1a;一份数据科学家的成长蓝图最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Data-Science-Roadmap”&#xff0c;作者是Moataz Elmesmary。这本质上是一份开源的学习路线图&#xff0c;旨在为想进入数据科学领域的人&#xff0c;或者已经在这个领域…...

固定词汇表在NLP跨领域处理中的优化实践

1. 项目背景与核心价值在自然语言处理领域&#xff0c;固定词汇表&#xff08;Fixated Vocabularies&#xff09;的应用一直是个值得深入探讨的话题。这个项目聚焦于通用、符号和医疗三个关键领域的词汇表优化&#xff0c;试图解决跨领域文本处理中的核心痛点。我最初接触这个问…...

企业数据管理新范式:Rclone多云端同步解决方案深度实践

企业数据管理新范式&#xff1a;Rclone多云端同步解决方案深度实践 【免费下载链接】rclone "rsync for cloud storage" - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex File…...