【算法练习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两道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二十四、W5100S/W5500+RP2040树莓派Pico<PHY的状态模式控制>

文章目录 1. 前言2. 相关简介2.1 简述2.2 原理2.3 优点&应用 3. WIZnet以太网芯片4. PHY模式配置测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 W5100S/W5500不仅支持自动PHY自动协商&#xff0c;而且支持用户自定义…

Java中的反射机制

获取字节码文件对象的三种方式 1&#xff0c;&#xff08;常用&#xff09;源代码阶段&#xff0c;Class.forName("全类名") 2&#xff0c;&#xff08;传参&#xff09;加载阶段 类名.class 3&#xff0c;&#xff08;前提有对象&#xff09;运行阶段 对象.getClas…

Mac使用brew搭建kafka集群

1. 第一步&#xff1a;单机搭建 单机搭建&#xff1a; 安装完后&#xff0c;默认自动安装对应版本zookeeper brew install kafka2.第二步&#xff1a;修改配置文件: 配置3个Kafka 第一个&#xff08;使用默认配置&#xff09; vi /opt/homebrew/etc/kafka/server.propertie…

相机标定:理论与实践

先讨论相机模型&#xff0c;说明投影关系的描述&#xff0c;介绍相机的内外参&#xff0c;最后完成标定。 一、内参含义 把需要标定的相机参数叫做内参&#xff08;intrinsics matrix&#xff09;&#xff0c;它决定了物体的实际位置Q在成像平面上的投影位置q&#xff0c;如下…

Django 缓存:提升Web应用性能详解

在构建动态Web应用时&#xff0c;性能往往是重要的关注点。Django, 作为一个高级Python Web框架&#xff0c;提供了一套全面的缓存系统帮助开发者提升网站性能&#xff0c;降低服务器负载&#xff0c;并改善用户体验。本文将深入讨论Django缓存机制&#xff0c;并通过示例展示如…

windows安装linux双系统启动盘的制作与恢复

下载镜像 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 制作启动盘 准备一个U盘&#xff0c;注意备份&#xff0c;启动盘的制作过程中是将ISO烧录到U盘中&#xff0c;会将U盘中的原内容覆盖掉在网上下载Win32DiskImager软件包烧录ISO…

详解Java中的重写和重载 | 动态绑定和静态绑定

目录 一.重载 二.重写 三.重载和重写的区别 一.重载 重载(overload)&#xff0c;Java中为了提高编程效率&#xff0c;允许我们使用方法重载&#xff0c;具体体现在&#xff0c;对于多个方法&#xff0c;他们的方法名相同&#xff0c;但参数列表不同&#xff0c;我们则将这种…

不想努力了,有没有不用努力就能考上硕士的方法

今年&#xff0c;硕士研究生考试报考人数再次刷新了纪录&#xff0c;高达474万人次。 这些年考研一直在扩招&#xff0c;但是录取率却越来越低&#xff0c;内卷血腥程度可想而知&#xff01; 2020年研究生报考人数341万&#xff0c;录取人数99.05万&#xff0c;录取率29.05%。…

Maven-依赖管理机制

一、背景和起源 依赖管理是Maven的一个核心功能。管理单个模块项目的依赖相对比较容易&#xff0c;但是如果是多模块项目或者有几百个模块的项目就是一个巨大的挑战。 如果手动构建项目&#xff0c;那么就先需要梳理各个模块pom中定义的依赖和版本&#xff0c;然后进行下载到本…

【MySQL】表的增删改查(强化)

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《MySQL》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&a…

物奇平台耳机宕机恢复功能实现

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送语音信号处理降噪算法&#xff0c;蓝牙音频&#xff0c;DSP音频项目核心开发资料, 物奇平台耳机宕机恢复功能实现 一 需求与场景 1 使…

TortoiseSVN 状态图标不显示的两种解决办法

文章目录 TortoiseSVN 方式解决注册表方式解决 TortoiseSVN 方式解决 在桌面或者资源管理器中鼠标右键打开 TortoiseSVN 设置选择 Icon Overlays (图标覆盖)Status cache&#xff08;状态缓存&#xff09; 选择 ‘Shell’ 选择 Icon Overlays&#xff08;图标覆盖&#xff09;…

基于AI智能分析网关的智慧视频监控系统一站式解决方案

1、功能概述 TSINGEE智能分析网关EasyCVR智慧视频监控系统基于云-边-端一体化协同架构&#xff0c;可兼容多协议、多类型的设备接入&#xff0c;实现视频数据采集、海量视频汇聚与处理、按需调阅、全网分发、 告警消息推送、数据级联共享、AI智能分析接入等视频能力服务&#…

我敢打赌,这个架构你一定知道!

大家好&#xff0c;我是鱼皮。开发后端项目时&#xff0c;我们最常见的一种架构模式就是 分层架构 。 所谓的分层架构&#xff0c;就是把系统自上而下分为多个不同的层&#xff0c;每一层都有特定的功能和职责&#xff0c;且只和自己的直接上层与直接下层 “打交道”。 分层架…

MySQL 数据库表格创建、数据插入及获取插入的 ID:Python 教程

创建表格 要在MySQL中创建表格&#xff0c;请使用"CREATE TABLE"语句。 确保在创建连接时定义了数据库的名称。 示例创建一个名为 “customers” 的表格&#xff1a; import mysql.connectormydb mysql.connector.connect(host"localhost",user"…

LDR6023AQ-PDHUB最简外围成本低搂到底就是干

USB-C PD协议里&#xff0c;SRC和SNK双方之间通过CC通信来协商请求确定充电功率及数据传输速率。当个设备需要充电时&#xff0c;它会发送消息去给适配器请求充电&#xff0c;此时充电器会回应设备的请求&#xff0c;并告知其可提供的档位功率&#xff0c;设备端会根据适配器端…

Java集合面试题

常见的java集合&#xff1f; 主要分为三类&#xff0c;List Map Set 列表 映射 集 集合相关的接口都在 java.util中 java集合的主要关系 List 特性&#xff1a; 存储的元素有序&#xff0c;可重复 Set 特性&#xff1a;存储的元素无序&#xff0c;不可重复 Map 特性…

【Proteus仿真】【51单片机】汽车尾灯控制设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用按键、LED模块等。 主要功能&#xff1a; 系统运行后&#xff0c;系统运行后&#xff0c;系统开始运行&#xff0c;K1键控制左转向灯&#xff1b;…

外贸企业GMS认证|SD-WAN专线解决方案支持 IPv6、IPv4

IP地址是英文internet protocol的缩写&#xff0c;是网络之间互连的协议。互联网诞生后&#xff0c;很长一段时间都是使用v4版本的IP协议&#xff0c;也就是 IPv4 &#xff0c;目前全球使用互联网的人数达到了48.8亿&#xff0c;而IPv4的地址库总共约43亿个地址&#xff0c;每个…
最新文章