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

news2024/11/26 9:58:16

在这里插入图片描述

​📝个人主页:@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.coloradmin.cn/o/1186402.html

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

相关文章

详解FreeRTOS:系统时钟节拍(进阶篇—8)

在详解FreeRTOS:FreeRTOS时间片调度(进阶篇—7)中我们讲到了时钟节拍这个概念,本篇博文将详细讲解FreeRTOS系统时钟节拍相关知识。 不管是什么系统,运行都需要有个系统时钟节拍,xTickCount 就是FreeRTOS 的系统时钟节拍计数器。每个滴答定时器中断中 xTickCount 就会加一…

第七讲:利用类事件改变对象的属性(上)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

数据结构-栈和队列(一)

目录 1.栈 1.1 栈的概念及结构 1.2 栈的实现 初始化栈&#xff1a; 入栈&#xff1a; 判空函数&#xff1a; 出栈&#xff1a; 获取栈顶元素&#xff1a; 获取栈中有效元素的个数&#xff1a; 销毁栈&#xff1a; 完整代码&#xff1a; 测试&#xff1a; 2. 队列 …

AI 绘画 | Stable Diffusion 高清修复、细节优化

前言 在 Stable Diffusion 想要生成高清分辨率的图片。在文生图的功能里&#xff0c;需要设置更大的宽度和高度。在图生图的功能里&#xff0c;需要设置更大的重绘尺寸或者重绘尺寸。但是设置完更大的图像分辨率&#xff0c;需要更大显存&#xff0c;1024*1024的至少要电脑的空…

软磁直流测试系统电参量指标

软磁直流测试系统电参量指标 输出能力 电流范围 0 &#xff5e; 25 A 最大功率 1000 W 调节细度 0.005%*RG ① 最佳测量不确定度 0.2% 磁通测量 (磁通计) 磁通计量程 500 μWb、5 mWb、25 mWb 磁通计漂移 ( 0.05%*RG )/min或1 μWb…

“双11”近300万商家为消费者贴息,花呗分期免息成增长“利器”

今年双11&#xff0c;很多消费者发现&#xff0c;能用花呗分期免息的商品变多了&#xff0c;不光是品牌旗舰店&#xff0c;还有中小淘宝卖家&#xff0c;不少直播间里的商品&#xff0c;都能用花呗分期免息。这背后&#xff0c;是平台、商家对花呗分期免息的重视和需要。 数据…

STM32独立看门狗(IWDG)溢出时间计算

什么是IWDG&#xff1f; 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动&#xff0c;即使主时钟发生故障它也仍然有效。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外&#xff0c;能够完全独立工作&#xff0c;并且对时间精度要求较低的场合。 从上图我们可以看出IWDG的时…

走进黑客漏洞赏金猎人的大门

走进黑客漏洞赏金猎人的大门,了解最新的漏洞、漏洞EXP和安全技术。 自动化SQL盲注 创建Nuclei模板:该文章首先介绍了如何创建一个Nuclei模板,以利用clusterbomb方法对我们感兴趣的功能点进行有效的暴力破解。 使用GET请求:在模板中,我们只使用GET请求。其中,{}被视为替换…

【题解 堆】 [蓝桥杯2023初赛] 整数删除

题目描述&#xff1a; 分析&#xff1a; 这道题一看就是一道堆的模板题 我们用堆记录当前的最小值以及当前值所在的下标 每次取出堆顶元素删除&#xff0c;而后将他的前一个以及后一个元素的值加上他的值就可以了 但是会有一个问题 你删除一个数之后&#xff0c;当前数左边和右…

电脑软件:推荐一款电脑多屏幕管理工具DisplayFusion

下载https://download.csdn.net/download/mo3408/88514558 一、软件简介 DisplayFusion是一款多屏幕管理工具&#xff0c;它可以让用户更轻松地管理连接到同一台计算机上的多个显示器。 二、软件功能 2.1 多个任务栏 通过在每个显示器上显示任务栏&#xff0c;让您的窗口管理更…

Leetcode—剑指OfferII LCR 044.在每个树行中找最大值【中等】

2023每日刷题&#xff08;二十三&#xff09; Leetcode—LCR 044.在每个树行中找最大值 DFS实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned …

Go 面向对象,多态,基本数据类型

程序功能解读 第一行为可执行程序的包名&#xff0c;所有的Go源文件头部必须有一个包生命语句&#xff0c;Go通过包名来管理命名空间。 第三行import是引用外部包的说明 func关键字声明定义一个函数&#xff0c;如果是main则代表是Go程序入口函数 Go源码特征解读 源程序以.g…

【MySQL数据库】 五

本文主要介绍了如果根据表之间的关系设计表,以及mysql的聚合/分组/联合查询. 一.表的设计 实体和关系的四种关系 1.一对一 一个账号只能对应一个学生; 一个学生只能有一个账号; 比如:账号表和学生是一对一的关系 * 可以在账号表中引入学生id * 也可以在学生表中引入账号id…

能链智电,“重”症在身

文 | 智能相对论 作者 | 陈选滨 在过去的1-9月&#xff0c;充电基础设施增量为243.2万台&#xff0c;新能源汽车销量627.8万辆&#xff0c;充电桩与新能源汽车的增量比为1&#xff1a;2.6&#xff0c;距离工信部此前提出“2025年实现车桩比2:1&#xff0c;2030年实现车桩比1:…

自主SSL品牌—JoySSL

JoySSL是一家为数不多的中国自主品牌SSL证书服务厂商&#xff0c;是自研推出的新一代https数字证书。 它不仅有着自己品牌JoySSL&#xff0c;还拥有着国内外绝大数主流证书品牌&#xff0c;遍寻诚意伙伴&#xff0c;单域名证书都是不限年限、不限证书张数不限量提供。 目前了…

C语言——计算n的阶乘

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i;int n 0;int s1;scanf("%d",&n);for(i1; i<n; i){s*i;}printf("s%d\n",s);return 0; }

HP电脑主机清除BIOS密码

HP电脑主机清除BIOS密码 重装系统肯定不能清除BIOS密码的。 拔掉电池一般也只能是将BIOS设定恢复出厂。 台式机需要清除BIOS密码&#xff0c;一般是主机板上会有对应的跳线&#xff0c; 关机&#xff0c;记住跳线的预设位置&#xff0c;拔掉跳线&#xff0c;重新开机&#x…

于道 - 前端项目启动步骤参考

1. 安装 启动过程有9个步骤&#xff1a; 1.1 安装 Node JS , V18版本的 &#xff08;安装步骤省略&#xff09; 1.2 安装 npm install -g yarn &#xff0c;node JS里边好像自带npm &#xff0c;通过npm的命令安装 yarn 1.3 切换到项目中去安装&#xff0c;npm install &a…

C++初阶 | [二] 类和对象(上)

摘要&#xff1a;class&#xff0c;成员函数&#xff0c;成员变量&#xff0c;类的大小&#xff0c;this 指针 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象…

吃啥大转盘

经常跟朋友出去吃饭&#xff0c;选择太困难了所以写了个简单的转盘&#xff0c;直接copy到txt文本然后把文件后缀改成html即可。 需要换食物直接在文件中找到 list 值按照格式替换一下即可。 效果&#xff1a; 代码块&#xff1a; <html><head><meta http-…