【每日一题】买卖股票的最佳时机含冷冻期

news2024/9/19 11:15:29

文章目录

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

Tag

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


题目来源

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


题目解读

这是股票系列问题的第五篇了,要求求出买卖股票的最佳时期以获得最大的利润,本题的关键在于:你卖出股票后无法在当天买入股票,需要等待一天。


解题思路

方法一:动态规划+空间优化

状态

我们使用 f[i] 表示第 i 天结束后的累计最大收益。因为我们最多同时买入一只股票并且有股票冷冻期的限制,所以会有以下三种不同的状态:

  • 我们目前持有一只股票,对应的累计最大收益用 f[i][0] 表示;
  • 我们目前不持有任何一只股票,并处于冷冻期中,对应的累计最大收益用 f[i][1] 表示;
  • 我们目前不持有任何一只股票,不处于冷冻期中,对应的累计最大收益用 f[i][2] 表示。

转移关系

对于以上的三种状态,我们有这样的转移关系:

  • 对于 f[i][0] 即我们第 i 天持有一只股票,这可以是第 i-1 天手中就持有的,对用的状态为 f[i-1][0];或者是第 i 天买入的,那么第 i-1 就不能持有股票并且不处于冷冻期中,对用的状态为 f[i-1][2],此时还要扣除买 prices[i] 股票的费用。因此,该情况下的状态转移方程为:

f [ i ] [ 0 ] = m a x ( f [ i − 1 ] [ 0 ] , f [ i − 1 ] [ 2 ] − p r i c e s [ i ] ) f[i][0] = max(f[i-1][0], f[i-1][2] - prices[i]) f[i][0]=max(f[i1][0],f[i1][2]prices[i])

  • 对于 f[i][1] 即我们第 i 天不持有任何一只股票且处于冷冻期,说明我们第 i 天卖出了一只股票,也就说明第 i-1 天我们必须持有一只股票,对应的状态为 f[i-1][0] 加上股票卖出的收益。因此,此时的转移关系为:

f [ i ] [ 1 ] = f [ i − 1 ] [ 0 ] + p r i c e s [ i ] f[i][1] = f[i-1][0] + prices[i] f[i][1]=f[i1][0]+prices[i]

  • 对于 f[i][2] 即我们第 i 天不持有任何一只股票,不处于冷冻期中,说明当天没有进行任何操作,那么第 i-1 天也就不会持有任何股票;第 i-1 天不持有任何一只股票又会有两种状态。因此,此时的转移关系为:

f [ i ] [ 2 ] = m a x ( f [ i − 1 ] [ 1 ] , f [ i − 1 ] [ 1 ] ) f[i][2] = max(f[i-1][1], f[i-1][1]) f[i][2]=max(f[i1][1],f[i1][1])

base case

f[0][0] = -prices[0],第 0 天持有股票,那么只能在第 0 天买入;
f[0][1] = 0f[0][2] = 0,我们不持有股票,那么收益为 0

最后返回

最后返回的是 max(f[n-1][0], f[n-1][1], f[n-1][2]),即第 n-1 天交易结束后三种状态的最大值,但是我们知道卖光手中的股票一定比手中还留有股票可以获得更大的利润,因此最后返回 max(f[n-1][1], f[n-1][2])

实现代码

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

空间优化

换一种想法,我们要通过买卖股票获得最大的利润,那么我们肯定希望手中的钱越多越好。我们仅使用三个变量来维护三种交易状态后的手中剩余的最大钱数:

  • buy:一天交易结束后手中还有股票的最大收益,初始化为 -prices[0]
  • sell:一天交易结束后手中没有股票的最大收益,,初始化为 0
  • sell_pre:用来记录前一天卖出股票后手中剩余的最大钱数,初始为 0;如果没有冷冻期,那么本题就退化成 122. 买卖股票的最佳时机 II,此时我们可以在第 i 天卖了股票之后又买当天的股票。但是,在增加了冷冻期的本题中,卖了股票之后就不能再买当天的股票了,需要等到第二天才能买,因此需要 sell_pre

注意对 sell_pre 的理解。

实现代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int buy = -prices[0];
        int sell_pre = 0, sell = 0;
        for (int p : prices) {
            buy = max(buy, sell_pre - p);
            sell_pre = sell;
            sell = max(sell, buy + p);
        }
        return sell;
    }
};

复杂度分析

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

空间复杂度: O ( n ) O(n) O(n),使用的额外空间为记录每天交易结束后的状态,占用的空间为 O ( 3 × n ) O(3 \times n) O(3×n)。空间优化后的空间复杂度为 O ( 1 ) O(1) O(1)


写在最后

买卖股票系列题目

题目解答
121. 买卖股票的最佳时机【面试经典150】买卖股票的最佳时机
122. 买卖股票的最佳时机 II【面试经典150】买卖股票的最佳时机 II
123. 买卖股票的最佳时机 III【每日一题】买卖股票的最佳时机 III
188. 买卖股票的最佳时机 IV【每日一题】买卖股票的最佳时机 IV
714. 买卖股票的最佳时机含手续费【每日一题】买卖股票的最佳时机含手续费

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

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

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

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

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

相关文章

基于spirngboot人事考勤管理信息系统

一&#xff1a;功能介绍 本系统前端采用vue框架以及Elemnt-UI,后端采用springboot、mysql、redis、mybatis等技术栈。 主要功能有登录、员工考勤、数据统计、薪资管理、权限管理、打卡管理、考勤审核、请假审批、薪资发放、报表统计、文件上传、文件下载、考勤设置、请假设置。…

Spring Boot注册Web组件

文章目录 什么是Web组件&#xff1f;注册Servlet注册Filter注册Listener总结 &#x1f389;欢迎来到架构设计专栏~Spring Boot注册Web组件 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;架构设计&a…

安装matplotlib__pygame,以pycharm调入模块

安装pip 安装matplotlib 安装完毕&#xff0c;终端输入pip list检查 导入模块出现bug&#xff0c;发现不是matplotlib包的问题&#xff0c;pycharm版本貌似不兼容&#xff0c;用python编辑器可正常绘图&#xff0c;pygame也可正常导入。 ​​​​​​​ pycharm版本问题解决 终…

k8s集群-7 service

工作负载的应用是如何暴露出去的 解决访问问题 Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service&#xff0c;应用可以方便地实现服务发现和负载均衡。 service默认只支持4层负载均衡能力&#xff0c;没有7层功能。(可以通过Ingress实现) service的类型: C…

【每日一题】买卖股票的最佳时机含手续费

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;动态规划空间优化 写在最后 Tag 【动态规划】【数组】【2023-10-06】 题目来源 714. 买卖股票的最佳时机含手续费 题目解读 本题与 122. 买卖股票的最佳时机 II 如出一辙&#xff0c;仅仅是增加了交易的手续费用。 解…

人工智能:定义未来,揭开历史神秘面纱,展望无限可能!

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

python读取vivo手机截图,将满屏图片文件移动别的路径

问题之初 python读取vivo手机截图&#xff0c; 将满屏图片文件移动别的路径好多这样的图片&#xff0c;占用手机大量的内存&#xff0c;食之无味弃之可惜&#xff01;那么会复制粘贴&#x1f440;代码的我们我们今天就把这些图片筛选清理掉。 这段代码 原有逻辑的基础上&…

MySQL中的 增 删 查 改(CRUD)

目录 新增 insert into 表名 value(数据&#xff0c;数据),.......&#xff1b; insert into 表名&#xff08;列1&#xff0c;列2.....&#xff09; value(数据&#xff0c;数据),.......&#xff1b; datatime 类型的数据如何插入&#xff1f; 查询 select * from 表名…

太阳 IT

太阳是我们太阳系的中心星体&#xff0c;也是地球上最重要的能源来源之一。太阳的直径约为109倍地球&#xff0c;质量也大约是地球的33万倍。它以极高的温度和压力维持着核聚变反应&#xff0c;将氢气转化为氦气&#xff0c;释放出巨大的能量和光辐射。 太阳对地球的影响非常广…

【Linux】进程探秘

文章目录 一、什么是进程&#xff1f;1.1写一个进程 二、操作系统是如何管理的进程的呢&#xff1f;2.1描述进程-PCB2.2组织进程 三、Linux下是怎么做的&#xff1f;3.1task_struct-PCB的一种3.2task_ struct内容分类3.3linux中组织进程3.4查看进程的相关属性 &#x1f340;小结…

【物联网】STM32的中断机制不清楚?看这篇文章就足够了

在嵌入式系统中&#xff0c;中断是一种重要的机制&#xff0c;用于处理来自外部设备的异步事件。STM32系列微控制器提供了强大的中断控制器&#xff0c;可以方便地处理各种外部中断和内部中断。本文将详细介绍STM32中断的结构和使用方法。 文章目录 1. 什么叫中断2. 中断优先级…

Spring Cloud Gateway:打造可扩展的微服务网关

文章目录 什么是微服务网关&#xff1f;Spring Cloud Gateway的优势使用Spring Cloud Gateway构建微服务网关步骤1&#xff1a;添加依赖步骤2&#xff1a;创建路由配置步骤3&#xff1a;创建过滤器步骤4&#xff1a;运行应用程序 进一步探索结论 &#x1f389;欢迎来到架构设计…

Ubuntu Server CLI专业提示

基础 网络 获取所有接口的IP地址 networkctl status 显示主机的所有IP地址 hostname -I 启用/禁用接口 ip link set <interface> up ip link set <interface> down 显示路线 ip route 将使用哪条路线到达主机 ip route get <IP> 安全 显示已登录的用户 w…

一看就懂系列:阿里云服务器ECS和轻量云服务器对比

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;轻量和ECS优缺点对比&#xff0c;云服务器ECS是明星级云产品&#xff0c;适合企业专业级的使用场景&#xff0c;轻量应用服务器是在ECS的基础上推出的轻量级云服务器&#xff0c;适合个人开发者单机应用访问量不高的网站…

【小沐学前端】Windows下搭建WordPress(nginx1.25、PHP8.2、WordPress6.3、MySQL5.7)

文章目录 1、简介1.1 Nginx1.2 PHP1.3 WordPress1.4 MySQL 2、下载2.1 Nginx2.2 PHP2.3 WordPress2.4 MySQL 3、搭建环境3.1 Nginx3.2 PHP3.3 WordPress3.4 MySQL 4、配置WordPress4.1 选择语言4.2 配置数据库4.3 登录界面4.4 常规设置4.5 写作操作 结语 1、简介 WordPress是基…

波奇学C++:AVL树

AVL解决二叉搜索树退化成链表&#xff0c;保证左右子树高度不差过1&#xff0c;尽可能接近满二叉树 AVL树的性质&#xff1a;高度差&#xff08;平衡因子&#xff09;的绝对值不超过1&#xff08;-1/0/1&#xff09; 平衡因子&#xff1a;右子树高度-左子树高度 用平衡因子控…

Netron可视化深度学习网络结构

有时候&#xff0c;我们构建网络模型想要直观的查看网络详细结构图&#xff0c;但是苦于没有办法。但是有了Netron以后&#xff0c;我们就可以将对应的onnx模型直接可视化&#xff0c;这样不仅可以观察网络的详细结构图&#xff0c;还可以查看网络每一层的具体参数&#xff0c;…

【算法练习Day12】树的递归遍历非递归遍历

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 递归遍历前序遍历中序遍历后…

23.3 Bootstrap 框架4

1. 轮播 1.1 轮播样式 在Bootstrap 5中, 创建轮播(Carousel)的相关类名及其介绍: * 1. carousel: 轮播容器的类名, 用于标识一个轮播组件. * 2. slide: 切换图片的过渡和动画效果. * 3. carousel-inner: 轮播项容器的类名, 用于包含轮播项(轮播图底下椭圆点, 轮播的过程可以显…

[论文必备]最强科研绘图分析工具Origin(2)——简单使用教程

本篇将介绍Origin的简单使用教程。 安装教程见上篇&#xff1a;[论文必备]最强科研绘图分析工具Origin&#xff08;1&#xff09;——安装教程 目录 &#x1f4e2;一、工具栏介绍 &#x1f4e3;1.1 行 1.1.1 标准栏 1.1.2 导入栏 1.1.3 工作表数据 1.1.4 图表数据 &a…