LeetCode 309. 最佳买卖股票时机含冷冻期

news2024/9/20 16:51:41

309. 最佳买卖股票时机含冷冻期

  

给定一个整数数组prices,其中第  prices[i] 表示第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: prices = [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

示例 2:

输入: prices = [1]
输出: 0

提示:

  • 1 <= prices.length <= 5000
  • 0 <= prices[i] <= 1000

思路: 

参考 LeetCode【评论区】题解

  • 首先,定义状态转移方程的四种状态:
    • A. dp[i][0]【当天不持有股票】并且也没有卖出操作:原本就不持有股票,可能前些天之前就早卖了没了 。
    • B. dp[0][1]【当天不持有股票】因为<今天有卖出操作>:原本是有股票的,但是今天卖掉了就没了,所以不持有​​​​​​。​
      其中第0天,可以理解为今天买入股票,然后当天又卖出了,所以当前收益为0
    • C. dp[i][2]【当天持有股票】今天才最新买入的股票:前提是前一天没有卖出操作,不处于冷冻期。
    • D. dp[i][3]【当天持有股票】并不是今天买入的股票:可能是从前一天“继承”过来的股票,一直没操作而已。
  • 接着,梳理动态规划的状态转移方程逻辑:
    • a.【当天不持有股票】并且也没有卖出操作
      dp[i][0] = max(dp[i-1][0], dp[i-1][1])
      dp[i-1][0]:原本就一直没有股票
      dp[i-1][1]:原本有但昨天刚卖了

    • b.【当天不持有股票】因为<今天有卖出操作>
      dp[i][1] = max(dp[i-1][2], dp[i-1][3]) + prices[i]
      dp[i-1][2]:昨天买入的股票,今天卖出
      dp[i-1][3]:昨天之前早就买入的股票,今天卖出

    • c.【当天持有股票】今天才最新买入的股票
      dp[i][2] = dp[i-1][0] - prices[i]
      题目要求:卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
      所以这里的前提:前一天不能卖出股票(不满足dp[i-1][1]),且之前不持有股票(不满足dp[i-1][2]和dp[i-1][3])
      那么今天才能买入,最后再减去今天买股票的钱 prices[i]

    • d.【当天持有股票】并不是今天买入的股票
      dp[i][3] = max(dp[i-1][2], dp[i-1][3])
      dp[i-1][2]:前一天买入的
      dp[i-1][3]:前一天虽未买入但前一天之前就早早持有股票了

  • 最后,返回结果:
    return max(dp[days-1][0], dp[days-1][1])
    因为买卖到最后,一定是不持有的(即使亏了,卖也比不卖强),所以应该是0和1两种状态,取较大值

时间复杂度:O(n)

空间复杂度:O(n)

// 参考 LeetCode【评论区】题解:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/solutions/181734/fei-zhuang-tai-ji-de-dpjiang-jie-chao-ji-tong-su-y/
// 题目要求:多次买卖一支股票
func maxProfit(prices []int) int {
    days := len(prices)
    dp := make([][]int, days)
    for i := 0; i < len(prices); i++ {
        dp[i] = make([]int, 4) // ABCD四种股票买卖中间状态
    }

    // A.【当天不持有股票】并且也没有卖出操作:原本就不持有股票,可能前些天之前就早卖了没了
    dp[0][0] = 0
   
    // B.【当天不持有股票】因为<今天有卖出操作>:原本是有股票的,但是今天卖掉了就没了,所以不持有
    dp[0][1] = 0 // 第0天,可以理解为今天买入股票,然后当天又卖出了,所以当前收益为0
   
    // C.【当天持有股票】今天才最新买入的股票:前提是前一天没有卖出操作,不处于冷冻期
    dp[0][2] = -prices[0]
   
    // D.【当天持有股票】并不是今天买入的股票:可能是从前一天“继承”过来的股票,一直没操作而已
    dp[0][3] = -prices[0] // 第0天特殊情况,初始化

    for i := 1; i < days; i++ {
        // a.【当天不持有股票】并且也没有卖出操作
        // dp[i-1][0]:原本就一直没有股票
        // dp[i-1][1]:原本有但昨天刚卖了
        dp[i][0] = max(dp[i-1][0], dp[i-1][1])

        // b.【当天不持有股票】因为<今天有卖出操作>
        // dp[i-1][2]:昨天买入的股票,今天卖出
        // dp[i-1][3]:昨天之前早就买入的股票,今天卖出
        dp[i][1] = max(dp[i-1][2], dp[i-1][3]) + prices[i]

        // c.【当天持有股票】今天才最新买入的股票
        // 题目要求:卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
        // 所以这里的前提:前一天不能卖出股票(不满足dp[i-1][1]),且之前不持有股票(不满足dp[i-1][2]和dp[i-1][3])
        // 那么今天才能买入,最后再减去今天买股票的钱 prices[i]
        dp[i][2] = dp[i-1][0] - prices[i]

        // d.【当天持有股票】并不是今天买入的股票
        // dp[i-1][2]:前一天买入的
        // dp[i-1][3]:前一天虽未买入但前一天之前就早早持有股票了
        dp[i][3] = max(dp[i-1][2], dp[i-1][3])
    } 

    // 因为买卖到最后,一定是不持有的(即使亏了,卖也比不卖强),所以应该是0和1两种状态,取较大值
    return max(dp[days-1][0], dp[days-1][1])
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

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

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

相关文章

第二个岳云鹏,跨年晚会含泪主持,成为一道最靓丽的风景

中国人自古讲究&#xff1a;百善孝入先&#xff0c;尤其是对于娱乐圈的明星来说&#xff0c;孝心和爱心更是他们成功的根本。 在这方面&#xff0c;德云社的小岳岳走在了前列&#xff0c;他用自己的孝心和爱心感动了粉丝&#xff0c;也收获了无数的鲜花和掌声。小岳岳的爱心体现…

2022年终总结 2023展望

一、回首2022 总结2022&#xff0c;同时也给新的一年设定目标&#xff0c;明年来还愿。 2022对我来说意义非凡&#xff0c;最重要莫过于考上了理想的研究生学校。 1~2月 考研初试刚结束&#xff0c;很长时间没敲过代码&#xff0c;而且本科期间刷的算法题不多&#xff0c;感觉…

02 USART

串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信&#xff0c;极大地扩展了单片机的应用范围&#xff0c;增强了单片…

RabbitMQ——高级特性

1、RabbitMQ高级特性 1.1、消息的可靠性投递 在使用 RabbitMQ 的时候&#xff0c;作为消息发送方希望杜绝任何消息丢失或者投递失败场景。 RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。 ⚫ confirm 确认模式 ⚫ return 退回模式 rabbitmq 整个消息投递的路径…

【回答问题】ChatGPT上线了!推荐30个以上比较好的命名实体识别模型

【回答问题】ChatGPT上线了&#xff01;推荐30个以上比较好的命名实体识别模型以及github源码&#xff1f; 推荐30个以上比较好的命名实体识别模型 命名实体识别模型是指识别文本中提到的特定的人名、地名、机构名等命名实体的模型。推荐的命名实体识别模型有&#xff1a; …

数据仓库搭建——本地数仓搭建详细流程

1 准备 1.1 本地虚拟机器准备 使用本地搭建三台机器&#xff0c;搭建数仓&#xff0c;模拟实际平台数据仓库的搭建。具体的搭建框架如下 安装软件角色主机1主机2主机3HadoopNameNode√SecondaryNameNode√DataNode√√√NodeManager√√√ResourceManager√√Zookeeperzk se…

educoder数据结构与算法 栈 第1关:实现一个顺序存储的栈

本文已收录于专栏 &#x1f332;《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》&#x1f332; 目录 任务描述 相关知识 编程要求 测试说明 AC_Code 任务描述 本关任务是实现 step1/SeqStack.cpp 中的SS_IsFull、SS_IsEmpty、SS_Length、SS_Push和SS_Pop五个操作…

巨星大衣哥参加元旦跨年晚会,一首老歌赢得现场一片掌声

刚刚结束的跨年晚会&#xff0c;各地都展现出了极大热情&#xff0c;这是后疫情时代的第一次跨年&#xff0c;自由了的国人自然兴奋异常。从南国到北疆、从湖南到山东&#xff0c;人们都沉浸在喜悦当中&#xff0c;期盼祖国风调雨顺&#xff0c;期盼来年都能身体安康。 远在山东…

【回答问题】ChatGPT上线了!推荐30个以上比较好的中文bert系列的模型/压缩模型

推荐30个以上比较好的中文bert系列的模型 以下是一些中文 BERT 系列的模型: BERT-Base, Chinese: 中文 BERT 基础版 BERT-Large, Chinese: 中文 BERT 大型版 BERT-WWM, Chinese: 中文 BERT 加入了 whole word masking 的版本 BERT-WWM-Ext, Chinese: 中文 BERT 加入了 whole …

大数据NiFi(五):NiFi分布式安装

文章目录 NiFi分布式安装 一、​​​​​​​为什么需要NiFi集群 二、使用内嵌的zookeepe

字符串常量

文章目录1.内存分布&#xff08;1&#xff09; 代码区&#xff08;2&#xff09; 全局区&#xff08;3&#xff09; 栈区(stack)&#xff08;4&#xff09; 堆区(heap)2.字符串常量的存储字符数组与字符指针3.字符串常量内存释放问题4.字符串常量生命周期5.字符串常量定义6.字符…

Object类

文章目录面试题&#xff1a;和equals()的区别回顾&#xff1a;和equals重写后的调用重写equals方法的原则答案toString()方法面试题&#xff1a;和equals()的区别 回顾&#xff1a;和equals &#xff1a;运算符 1、可以使用在基本数据变量和引用数据变量中 2、如果比较的是基…

Model Animation动画页签

1、Animation动画页签 当我们选中包含动画剪辑的的模型时&#xff0c;该页签将显示动画设置相关的内容 动画剪辑是Unity动画的最小构成元素&#xff0c;代表一个单独的动作 当美术同学做好动画导出时建议将模型和动画文件分别导出 导出包含网格信息不包含动作信息模型导出不…

【大数据】CentOS7环境下安装MySQL数据库

文章目录1.安装mysql1.1 删除CentOS系统自带数据库1.2 开始安装mysql1.3 启动mysql服务&#xff0c;并设置密码1.4 授权所有外部用户连接MySQL&#xff08;了解&#xff09;2.客户端操作mysql常见查询操作解决汉字乱码问题创建操作1.安装mysql CentOS7自带的是Mariadb&#xf…

Prometheus学习和整理

是基于时序数据库的开源监控告警系统,非常适合对K8S集群的监控,它通过HTTP协议周期性的抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控, 特点: 支持多维数据模型&#xff1a;由度量名和键值对组成的时间序列数据 内置时间序列数据库TSDB 支持PromQL查…

AI修复照片

一、前言 最近闲来无事&#xff0c;翻了翻以前的老照片&#xff0c;看着多年前的老照片&#xff0c;感慨万千&#xff0c;仿佛又回到了以前的青春岁月。 只可惜青春易逝&#xff0c;无法重来。意气风发&#xff0c;头角峥嵘的画面只能永远地留存在相片之中了。只叹当时没有多拍…

Windows下数据资源公开访问之环境搭建方法(2023.1.2)

Windows下数据资源公开访问之环境搭建方法&#xff08;2023.1.2&#xff09;1、需求分析2、常用的解决方案2.0 前提环境&#xff08;Java Node&#xff09;2.1 方案一&#xff1a;利用现有服务器容器&#xff08;以Tomcat为例&#xff09;2.1.1 下载Tomcat并解压2.1.2 配置系统…

数据结构-考研难点代码突破(C++实现有向图最短路径算法(Dijkstra,Floyd-Warshall算法)图解操作细节(引自C语言中文网))

以代码的方式复习考研数据结构知识点&#xff0c;这里在考研不以代码为重点&#xff0c;而是以实现过程为重点 文章目录1. 最短路径2. 单源最短路径ⅠDijkstra算法C代码3. 多源最短路径Ⅰ Floyd-Warshall算法C代码1. 最短路径 图的生成树针对的是无向图&#xff0c;图的最短路…

error ‘for’ loop initial declarations are only allowed in C99 mode的报错原因和两种解决办法

error: ‘for’ loop initial declarations are only allowed in C99 mode的报错原因和两种解决办法 for(int i0;i<5;i) { … } 错误&#xff1a;使用gcc编译代码报错 &#xff1a;error: ‘for’ loop initial declarations are only allowed in C99 mode note: use …

Spark02: Spark三种任务提交方式

1. 直接在IDEA中执行&#xff0c;方便在本地环境调试代码 2. 使用spark-submit提交到集群执行【实际工作中使用】 3. 使用spark-shell&#xff0c;方便在集群环境调试代码 比如&#xff1a;需要连接数据库&#xff0c;无法在本地调试的情况。 spark-shell 实现了用户可以逐…