【每日一题】买卖股票的最佳时机 III

news2025/2/26 21:26:54

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:动态规划
  • 写在最后

Tag

【动态规划】【数组】【2023-10-03】


题目来源

123. 买卖股票的最佳时机 III


题目解读

有一个表示股票价格的数组,你需要计算出在最多可以完成两笔交易的前提下可获得的最大收益,你必须在再次购买之前卖掉之前的股票。


解题思路

又是认真学习 买卖股票的最佳时机 III 官方题解的一天。

方法一:动态规划

状态
我们在任意的一天交易之后,会有以下五种状态:

  • 没有进行任何交易;
  • 只有过一次买操作,记为 b u y 1 buy_1 buy1
  • 进行了一次买操作和一次买操作,即完成了一笔交易,记为 s e l l 1 sell_1 sell1
  • 在完成看第一笔交易之后,进行了第二次买操作,记为 b u y 2 buy_2 buy2;
  • 完成了全部的两笔交易,记为 s e l l 2 sell_2 sell2

转移关系

如果我们知道了第 i-1 天的这四个状态,那么就可以通过第 i-1 天转移到第 i 天,具体地:

  • 对于 b u y 1 buy_1 buy1:在第 i 天可以不进行任何操作,那么这一天的 b u y 1 buy_1 buy1 等于前一天的只进行一次买操作获得的最大利润,我们记为 b u y 1 ′ buy^{'}_1 buy1;如果在第 i 天只进行了一次买操作,那么这一天的 b u y 1 buy_1 buy1 等于前一天的不进行操作获得的最大利润。因此, b u y 1 = m a x ( b u y 1 ′ , − p r i c e s [ i ] ) buy_1 = max(buy^{'}_1, -prices[i]) buy1=max(buy1,prices[i])
  • 对于 s e l l 1 sell_1 sell1:在第 i 天可以不进行任何操作,那么这一天的 s e l l 1 sell_1 sell1 等于前一天的完成了一笔交易获得的最大利润,我们记为 s e l l 1 ′ sell^{'}_1 sell1;如果在第 i 天只进行了一次卖操作,那么这一天的 s e l l 1 sell_1 sell1 等于前一天的进行一次买操作获得的最大利润。因此, s e l l 1 = m a x ( s e l l 1 ′ , b u y 1 ′ − p r i c e s [ i ] ) sell_1 = max(sell^{'}_1, buy^{'}_1 - prices[i]) sell1=max(sell1,buy1prices[i])
  • 同理可得:
    • b u y 2 = m a x ( b u y 2 ′ , s e l l 1 ′ − p r i c e s [ i ] ) buy_2 = max(buy^{'}_2, sell^{'}_1 - prices[i]) buy2=max(buy2,sell1prices[i])
    • s e l l 2 = m a x ( s e l l 2 ′ , b u y 2 ′ + p r i c e s [ i ] ) sell_2 = max(sell^{'}_2, buy^{'}_2 + prices[i]) sell2=max(sell2,buy2+prices[i])

在考虑边界条件时,我们需要理解下面的这个事实:

无论题目中是否允许「在同一天买入并且卖出」这一操作,最终的答案都不会受到影响,这是因为这一操作带来的收益为零。

因此,最终的状态转移方程为:

{ b u y 1 = max ⁡ ( b u y 1 , − p r i c e s [ i ] ) s e l l 1 = max ⁡ ( s e l l 1 ,   b u y 1 + p r i c e s [ i ] ) b u y 2 = max ⁡ ( b u y 2 , s e l l 1 − p r i c e s [ i ] ) s e l l 2 = max ⁡ ( s e l l 2 , b u y 2 + p r i c e s [ i ] ) \left\{ \begin{array}{c} buy_1=\max \left( buy_1,-prices\left[ i \right] \right)\\ sell_1=\max \left( sell_1,\ buy_1+prices\left[ i \right] \right)\\ buy_2=\max \left( buy_2,sell_1-prices\left[ i \right] \right)\\ sell_2=\max \left( sell_2,buy_2+prices\left[ i \right] \right)\\ \end{array} \right. buy1=max(buy1,prices[i])sell1=max(sell1, buy1+prices[i])buy2=max(buy2,sell1prices[i])sell2=max(sell2,buy2+prices[i])

base case

那么对于边界条件,我们考虑第 =0 的四个状态: b u y 1 buy_1 buy1 为以 p r i c e s [ 0 ] prices[0] prices[0] 价格买入股票,因此 b u y 1 = p r i c e s [ 0 ] buy_1=prices[0] buy1=prices[0] s e l l 1 sell_1 sell1 为同一天买入并卖出 ,因此 s e l l 1 = 0 sell_1 = 0 sell1=0 b u y 2 buy_2 buy2 即为在同一天买入并且卖出后再以 p r i c e s [ 0 ] prices[0] prices[0] 的价格买入股票,因此 b u y 2 = − p r i c e s [ 0 ] buy_2=−prices[0] buy2=prices[0];同理可得 s e l l 2 = 0 sell_2=0 sell2=0

最后返回

在动态规划结束后,由于我们可以进行不超过两笔交易,因此最终的答案在 0 s e l l 1 sell_1 sell1 s e l l 2 sell_2 sell2 中,为三者中的最大值。然而我们可以发现,由于在边界条件中, s e l l 1 sell_1 sell1 s e l l 2 sell_2 sell2 的值已经为 0,并且在状态转移的过程中我们维护的是最大值,因此 s e l l 1 sell_1 sell1 s e l l 2 sell_2 sell2 一定大于等于 0。同时,如果最优的情况对应的是恰好一笔交易,那么它也会因为我们在转移时允许在同一天买入并且卖出这一宽松的条件,从 s e l l 1 sell_1 sell1 转移至 s e l l 2 sell_2 sell2 ,因此最终的答案即为 s e l l 2 sell_2 sell2

实现代码

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

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 prices 的长度。

空间复杂度: O ( 1 ) O(1) O(1)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

什么样的枕头可以让睡眠更舒适——四个月的反复试验结果

如何提高睡眠质量&#xff0c;我们先从睡眠中的呼吸质量谈起&#xff0c;这里面有大量的数据和记录&#xff0c;我后续会整理我这七八年来积累的所有睡眠质量数据进行分析汇总和处理。 几个月前我在看我的华为手表监控的睡眠数据时看到了关于睡眠中呼吸质量的数据&#xff0c;最…

1.6 计算机网络的性能

思维导图&#xff1a; 1.6.1 计算机网络的性能指标 前言&#xff1a; 我的理解&#xff1a; 这段前言主要介绍了关于计算机网络性能的两个方面的讨论。首先&#xff0c;计算机网络的性能可以通过一些重要的性能指标来衡量。但除了这些指标之外&#xff0c;还有一些非性能特征…

【强化算法专题一】双指针算法

【强化算法专题一】双指针算法 1.双指针算法--移动零2.双指针算法--复写零3.双指针算法--快乐数4.双指针算法--盛水最多的容器5.双指针算法--有效三角形的个数6.双指针算法--和为s的两个数7.双指针算法--三数之和8.双指针算法--四数之和 1.双指针算法–移动零 算法原理解析----…

BIT-6自定义类型和动态内存管理(11000字详解)

一&#xff1a;自定义类型 1.1&#xff1a;结构体 在生活中&#xff0c;基本数据类型可以描述绝大多数的物体&#xff0c;比如说名字&#xff0c;身高&#xff0c;体重&#xff0c;但是还有一部分物体还不足够被描述&#xff0c;比如说我们该如何完整的描述一本书呢&#xff…

VSCode安装图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 教程说明 本教程旨在详细介绍VSCode的安装过程及其注意事项。 下载VSCode 请在官方网站 https://code.visualstudio.com/ 下载https://code.visualstudio.com/至本地&…

Android学习之路(18) 数据存储与访问

文件存储读写 1.Android文件的操作模式 学过Java的同学都知道&#xff0c;我们新建文件&#xff0c;然后就可以写入数据了&#xff0c;但是Android却不一样&#xff0c;因为Android是 基于Linux的&#xff0c;我们在读写文件的时候&#xff0c;还需加上文件的操作模式&#x…

设计模式之适配器模式:接口对接丝般顺滑(图代码解析面面俱到)

目录 概要概念组成类图工作原理应用场景优点 类型类适配器模式对象适配器模式两者区别示例代码 实现&#xff08;对象适配器详解&#xff09;业务背景代码 常见问题为什么有适配器模式适配器模式告诉我们什么适配器模式体现了哪些设计原则关联方式实现了逻辑继承适配器模式在Sp…

春招秋招,在线测评应用得越来越普及

这年代提到测评&#xff0c;很多人都比较熟悉&#xff0c;它有一种根据所选的问题给予合适答案方面的作用。因为不同的测评带来的影响不一样&#xff0c;所以很多人都会关注在线测评的内容有哪些。在校园招聘上面&#xff0c;在线测评也频繁出现了&#xff0c;这让很多人好奇它…

VD6283TX环境光传感器驱动开发(2)----获取光强和色温

VD6283TX环境光传感器驱动开发----1.获取光强和色温 概述视频教学样品申请源码下载参考源码设置增益基准配置设置ALS曝光时间通道使能启用ALS操作中断查询及清除获取ALS数据计算光强及色温结果演示 概述 为了更好地利用VD6283TX传感器的特点和功能&#xff0c;本章专门用于捕获…

用通俗易懂的方式讲解大模型分布式训练并行技术:张量并行

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…

最近脑机接口突破性成果这么多,它到底走到哪一步了?

美国心脏协会(AHA)首席临床科学官、哥伦比亚大学神经病学和流行病学终身教授Mitchell Elkind在接受NeuroNews采访时概述了脑机接口(BCI)技术的巨大潜力:“恢复患者活动能力的可能性可能会带来巨大的好处。”“对于那些功能受限的人来说&#xff0c;即使是微小的进步也能改变他们…

【数仓精品理论分析】能不能学大数据?

【数仓精品理论分析】能不能学大数据&#xff1f; 还能不能学大数据datapulse官网&#xff1a; 自身情况数据行业发展情况 还能不能学大数据 首先看到这个话题的时候&#xff0c;我是这样想的&#xff0c;能不能学大数据需要参考本人的自身情况【学历、年龄、决心、有没有矿或者…

高層建築設計和建造:從避難層到設備間和防風防火防水的設計理念,酒店住宅辦公樓都有什麽房間(精簡)

樓層概覽 標準層居住、辦公、商業等功能的樓層。結構和裝修與其他樓層相同&#xff0c;可供人正常居住、工作和活動避難層專門用於人員避難的樓層&#xff0c;通常會相隔數十個標準層&#xff0c;樓梯通常和標準層是錯開的(非公用)&#xff0c;具有更多的通風口。牆體和樓板具…

黑豹程序员-架构师学习路线图-百科:CSS-网页三剑客

文章目录 1、为什么需要CSS2、发展历史3、什么是CSS4、什么是SASS、SCSS 1、为什么需要CSS 作为网页三剑客的第二&#xff0c;CSS为何需要它&#xff0c;非常简单HTML只能完成页面的展现&#xff0c;但其做出来的页面奇丑无比。 随着网络的普及&#xff0c;人们的要求更高&…

Ubantu 20.04 卸载与安装 MySQL 5.7 详细教程

文章目录 卸载 MySQL安装 MySQL 5.71.获取安装包2.解压并安装依赖包3.安装 MySQL4.启动 MySQL 扩展开启 gtid 与 binlog 卸载 MySQL 执行以下命令即可一键卸载&#xff0c;包括配置文件目录等。 # 安装sudo软件 apt-get install sudo -y # 卸载所有以"mysql-"开头的…

小病变检测:Gravity Network for end-to-end small lesion detection

论文作者&#xff1a;Ciro Russo,Alessandro Bria,Claudio Marrocco 作者单位&#xff1a;University of Cassino and L.M. 论文链接&#xff1a;http://arxiv.org/abs/2309.12876v1 内容简介&#xff1a; 1&#xff09;方向&#xff1a;医学影像中小病变检测 2&#xff0…

PyQt5+Qt设计师初探

在上一篇文章中我们搭建好了PyQt5的开发环境&#xff0c;打铁到趁热我们基于搭建好的环境来简单实战一把 一&#xff1a;PyQt5包模块简介 PyQt5包括的主要模块如下。 QtCore模块——涵盖了包的核心的非GUI功能&#xff0c;此模块被用于处理程序中涉及的时间、文件、目录、数…

代谢组学最常用到的数据分析方法(五)

代谢组学是一门对某一生物或细胞所有低分子质量代谢产物&#xff08;以相对分子质量<1000的有机和无机的代谢物为研究核心区&#xff09;进行分析的新兴学科。因此从复杂的代谢组学数据中确定与所研究的现象有关的代谢物&#xff0c;筛选出候选生物标记物成为代谢物组学研究…

秋招,网申测评,认知能力测试

随着秋季的到来&#xff0c;越来越多的企业开始进行职业招聘&#xff0c;在这些招聘中&#xff0c;我们总会看到“认知能力测试”的影子。说到这个测试&#xff0c;很多人可能还不太理解&#xff0c;不知道这种测试是什么。 1、什么是认知能力测试 认知能力是指大脑加工、…

【Diffusion】DDPM - (1)预备基础知识

预备基础知识 1、概率 - 条件独立 A 和 B 是两个独立事件    ⇒    P ( A ∣ B ) = P ( A ) \; \Rightarrow \; P(A|B) = P(A) ⇒P(A∣B)=P(A), P ( B ∣ A ) = P ( B ) \quad P(B|A) = P(B) P(B∣A)=P(B) ⇒ P ( A , B ∣ C ) = P ( A ∣ C ) P ( B ∣ C ) \quad\quad…