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

news2024/11/18 11:22:34

309.最佳买卖股票时机含冷冻期(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

状态定义

一、很容易想到四种状态:

  • a.今天买入;
  • b.今天卖出;
  • c.昨天卖出,今天处于冷冻期,无法进行操作;
  • d.今天不操作,处于持有状态;

显然,a和d可以合并为持有状态,因此本题需要处理三种状态:「当天持有股票」、「当天不持有股票,卖出」、「当天不持有股票,处于冷冻期」。

二、状态表示

使用三个一维数组来表示这三种状态:

  • have[i]:第 i 天持有股票的最大收益;
  • sell[i] : 第 i 天售出股票的最大收益;
  • freeze[i] :第 i 天为冷冻期的最大收益;

状态转移

在这里插入图片描述

  • 对于持有状态 have,它可以由两种情况得到:

    第一种是「昨天就持有股票,今天不进行任何操作」,所以今天的收益等于昨天持有股票的收益,即 have[i] = have[i-1];
    第二种是「昨天不属于冷冻期,今天选择买入」,所以今天的收益等于冷冻期后的收益扣去今天的股票价格,即have[i] = freeze[i-1]-prices[i];

    要使得收益最大化,所以持有状态的收益就是两种情况下的最大收益,即 have[i] = max(have[i-1], freeze[i-1]-prices[i]);

  • 对于卖出状态,它只能由持有状态得到:「昨天持有股票,今天将其售出」,所以收益是昨天持有股票的收益加上今天的股票价格,即:sell[i] = have[i-1] + prices[i];

  • 对于冷冻期状态,它可以由两种情况得到:

    第一种是「昨天售出,进入冷冻期」,所以收益就是昨天售出股票后的收益,即freeze[i] = sell[i-1];
    第二种是「昨天是冷冻期,不持有任何股票,今天仍然不进行买入操作,所以保持在冷冻期」,那么收益就是昨天冷冻期的收益,即freeze[i] = freeze[i-1];

    同样地,要使得收益最大化,所以冷冻期的收益就是两种情况下的最大收益,即 freeze[i] = max(sell[i-1], freeze[i-1]);

初始化

  • have[0] = -prices[0]; :第0天要持有股票,那么一定需要选择买入价格为 prices[0] 的股票;
  • sell[0] = 0 :第0天要售出,且不持有股票,那么当天一定是买卖同一支股票,收益为 0;
  • freeze[0] = 0:第 0 天处于冷冻期,可以理解为不进行任何操作,即不买不卖,所以收益为 0。

最终的返回结果

最大收益一定是完成交易(即不持有股票) 的情况,所以返回 sell[n-1]freeze[n-1] 的最大值 。

易错点

  • 这道题可以多次买卖同一股票,因此初始化条件和之前的题目不一样,第 0 天处于 sell 和 freeze 状态也是合法状态,应该设为 0。
  • 对于持有状态,包含两种情况,也可以单独考虑,但稍显繁琐。

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() <= 1)  return 0;
        int n = prices.size();
        vector<int> have(n), sell(n), freeze(n);

        // 初始化
        have[0] = -prices[0];
        sell[0] = freeze[0] = 0;

        for(int i=1; i<n; ++i){
            have[i] = max(have[i-1], freeze[i-1]-prices[i]);
            sell[i] = have[i-1] + prices[i];
            freeze[i] = max(sell[i-1], freeze[i-1]);
        }
        return max(sell[n-1], freeze[n-1]);
    }
};

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

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

相关文章

SD卡变成RAW格式怎么办?SD卡RAW格式的解决办法

使用SD卡的小伙伴有没有遇到这种情况&#xff0c;SD卡无法访问提示格式化&#xff0c;查看SD卡的属性发现文件系统类型变成RAW格式&#xff0c;而非之前的NTFS或FAT32格式。那么当SD卡变成raw格式怎么办&#xff1f;如果里面有重要数据怎么办&#xff1f;SD卡RAW格式怎么恢复数…

【Java】什么是SOA架构?与微服务有什么关系?

文章目录 服务化架构微服务架构 我的一个微服务项目&#xff0c;有兴趣可以一起做 服务化架构 我们知道&#xff0c;早期的项目&#xff0c;我们都是把前后端的代码放在同一个项目中&#xff0c;然后直接打包运行这个项目&#xff0c;这种项目我们称之为单体项目&#xff0c;比…

m4a怎么转换成mp3的4种方法值得收藏

m4a怎么转换成mp3&#xff1f;首先我们得了解m4a是什么格式。m4a是MPEG-4音频标准的文件扩展名&#xff0c;它是一种音频格式&#xff0c;由苹果公司推出。该格式的音质没有损失&#xff0c;且不受版权保护&#xff0c;因此可以进行自由编辑和转发。该格式的兼容性相对较弱&…

PIE-SAR软件自动化编译与发布

1.背景 SVN版本控制下多人协调编写代码&#xff0c;会经常性的提交新功能&#xff0c;修改完善已有功能。产品经理、测试人员需定期回归测试&#xff0c;确保禅道Bug已经修复&#xff0c;这就需要经常性地打包软件。为了节省编译时间&#xff0c;也方便产品经理可随时去取最新…

MiniGPT-4,开源了!

上个月GPT-4发布时&#xff0c;我曾写过一篇文章分享过有关GPT-4的几个关键信息。 当时的分享就提到了GPT-4的一个重要特性&#xff0c;那就是多模态能力。 比如发布会上演示的&#xff0c;输入一幅图&#xff08;手套掉下去会怎么样&#xff1f;&#xff09;。 GPT-4可以理解…

基于51单片机的差分双路电压检测(基于ADC0832)

文章目录 前言一、本文任务二、材料三、电路图四、代码解读1.引脚定义及参数2.定时器中断与延时开启3.数码管显示定义及ADC0832函数初始化4.数据转换及数码管显示5.主函数及定时器函数6.所有代码&#xff08;就一个c文件&#xff09; 总结 前言 博主终于又空出时间啦&#xff…

二战失利,剩下的路?

作者&#xff1a;阿秀 校招八股文学习网站&#xff1a;https://interviewguide.cn 这是阿秀的第「260」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 欢迎今年参加秋招的小伙伴加入阿秀的学习圈&#xff0c;目前已经超过 2300 小伙伴加入&#xff01;去年认真准备和走下来的基…

如何使用chatGPT生成小红书种草文案

如何使用chatGPT生成小红书种草文案 小红书拥有超千万的日活用户&#xff0c;为商家提供了广阔的变现空间和机会&#xff0c;成为商家选择在小红书上推广的原因之一。 小红书种草文案&#xff0c;例如具有影响力的热门话题、产品使用方法等内容可以让消费者迅速了解产品为品牌…

小米青春版路由器刷openwrt

下载小米路由器R1CL开发版 通过手动上传更新&#xff0c;更改固件版本 将之前地址栏URL中的 /web/home#router 替换为&#xff08;密码为admin&#xff09; /api/xqsystem/set_name_password?oldPwd123456789&newPwdadmin如果网页返回 {“code”:0} &#xff0c;则说明修…

JAVA的BIO、NIO、AIO模式精解(一)

1. BIO、NIO、AIO介绍 在不同系统或进程间数据交互&#xff0c;或高并发场景下都选哟网络通信。早期是基于性能低下的同步阻塞IO(BIO)实现。后支持非阻塞IO(NIO)。 前置须知&#xff1a;javsse&#xff0c;java多线程&#xff0c;javaIO&#xff0c;java网络模型 目的&#xf…

[江西专升本/信息技术]计算机网络基础

1、概论 目前主要从资源共享观点定义计算机网络&#xff1a; 用通信路线和通信设备将分布在不同地点的具有独立功能的多个计算机系统相互连接起来&#xff0c;在功能完善的网络软件的支持下实现彼此之间的数据通信和资源共享的系统&#xff1b; 我们可以这么说&#xff0c;“…

effective c++ item30-34

item30:理解inline 1、inline函数 用inline修饰函数可以防止multiple definition的错误 // foo.h inline int foo(int x){ // 如果不加inline&#xff0c;在编译时会有两个foo.h被包含进去&#xff0c;导致链接出错static int n 1;return x * (n ); } // bar1.cpp #includ…

【车道线算法】GANet-车道线检测环境配置一文通关

目录 GANet配置全纪录 下载代码 conda环境部署 安装torch和cudatoolkit 安装其他包 编译 总结 GANet配置全纪录 下载代码 GitHub - Wolfwjs/GANet: A Keypoint-based Global Association Network for Lane Detection. Accepted by CVPR 2022 进入代码网址的默认master…

ArcGIS Pro工程

目录 1 工程基础架构 2 工程内容 3 新建工程及工程文件 3.1 工程模板 3.2 工程名称和位置 3.2.1 基于“地图模板”创建新工程 3.2.2 基于“目录模板”创建新工程 3.2.3 基于“全局场景”创建新工程 3.2.4 基于“局部场景”创建新工程 3.3 工程文件 3.3.1 默认地理…

子元素选择器

知识点&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" c…

【MySQL高级】——用户与权限管理

一、用户管理 <1> 登录 mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"-h参数 后面接主机名或者主机IP&#xff0c;hostname为主机&#xff0c;hostIP为主机IP。 -P参数 后面接MySQL服务的端口&#xff0c;通过该参数连接…

序列检测和序列发生器——verilog代码实现

文章目录 前言一、序列检测器1.1 重复序列检测1.1.1 序列缓存对比/移位寄存器法1.1.2 状态机法 1.2 非重复序列检测 二、序列发生器2.1 移位寄存器法2.2 反馈法2.3 计数器法 前言 2023.4.25 2023.4.26 学习打卡&#xff0c;天气转晴 一、序列检测器 1.1 重复序列检测 1.1.1 …

HTML基础标签

目录 1.html文件结构 2.注释 3.文本标签 4.图片 5.音频与视频 6.超链接 7.表单 8.列表&#xff08;可以嵌套&#xff09; 无序列表 有序列表 定义列表 9.表格 10.语义标签 11.特殊符号 1.html文件结构 <!-- 文档类型声明 --> <!DOCTYPE html> <html>…

学系统集成项目管理工程师(中项)系列12_干系人管理

1. 要管理干系人的期望&#xff0c;更要保证他们的适度参与&#xff0c;而后者是项目成功非常关键的因素之一 1.1. 识别干系人及其信息 1.2. 评估关键干系人的诉求和影响力 1.3. 对干系人分类 1.4. 制定干系人管理计划 1.5. 【19上选56】 2. 识别干系人 2.1. 典型干系人…

如何解决宝塔面板nginx占用80端口的问题

前言: 由于使用Docker部署前端项目老是报错说80端口被占用,所以不得不去查找原因并且解决 上网查了很多资料说修改80端口这对我(有点强迫症)来说修改让我很难受 开始: 我们去找到虚拟机的这个目录 /www/server/panel/vhost/nginx 然后直接修改下面的文件 修改文件的端口 最…