【LeetCode】动态规划—309. 买卖股票的最佳时机含冷冻期(附完整Python/C++代码)
动态规划—309. 买卖股票的最佳时机含冷冻期
- 题目描述
- 前言
- 基本思路
- 1. 问题定义
- 2. 理解问题和递推关系
- 状态定义:
- 状态转移公式:
- 初始条件:
- 3. 解决方法
- 动态规划方法
- 伪代码:
- 4. 进一步优化
- 5. 小总结
- Python代码
- Python代码解释总结
- C++代码
- C++代码解释总结
- 总结
题目描述
前言
最佳买卖股票时机含冷冻期问题 是一个经典的动态规划问题。给定一个数组表示股票的价格,每天你只能做一件事:买入股票、卖出股票或者冷冻(休息)。如果你在一天卖出了股票,那么第二天你无法进行任何交易(有一天的冷冻期)。目标是通过买卖股票来获得最大的收益。该问题要求我们结合动态规划的思想,合理规划买卖操作,以获取最大的利润。
基本思路
1. 问题定义
给定一个数组 prices
,其中 prices[i]
表示第 i
天的股票价格。你可以在任意天选择买入或卖出股票,但在卖出股票后的第二天不能买入(有一天冷冻期)。目标是找到能够获得的最大利润。
2. 理解问题和递推关系
为了帮助我们理解该问题的动态规划思路,我们可以定义几种状态来表示我们在某一天的持有情况。主要有以下三种状态:
状态定义:
-
持有股票的状态(
hold
):hold[i]
表示在第i
天结束时,我们持有股票时的最大收益。- 这个状态可以从两种情况转移而来:要么是之前买入并继续持有(
hold[i-1]
),要么是今天刚刚买入。
-
未持有股票且处于冷冻期的状态(
cooldown
):cooldown[i]
表示在第i
天结束时,我们处于冷冻期时的最大收益(也就是说,第i
天刚卖出股票,不能买入股票)。- 这个状态只能通过在
i
天卖出股票后进入,因此cooldown[i] = hold[i-1] + prices[i]
。
-
未持有股票且不处于冷冻期的状态(
sell
):sell[i]
表示在第i
天结束时,我们没有持有股票且没有处于冷冻期的最大收益。- 这个状态有两种来源:要么是处于冷冻期后过了一天(
cooldown[i-1]
),要么是之前一直不持有股票(sell[i-1]
)。
状态转移公式:
-
hold[i] = max(hold[i-1], sell[i-1] - prices[i])
- 要么我们继续持有股票,要么我们在第
i
天买入股票。
- 要么我们继续持有股票,要么我们在第
-
cooldown[i] = hold[i-1] + prices[i]
- 表示我们在第
i
天卖出了股票,进入冷冻期。
- 表示我们在第
-
sell[i] = max(sell[i-1], cooldown[i-1])
- 表示我们处于不持有股票且不在冷冻期的状态,可以是冷冻期结束或者一直未持有股票。
初始条件:
hold[0] = -prices[0]
:表示在第 0 天买入股票的收益。sell[0] = 0
:在第 0 天不持有股票,收益为 0。cooldown[0] = 0
:在第 0 天没有冷冻期,收益为 0。
3. 解决方法
动态规划方法
- 定义
hold[i]
,cooldown[i]
和sell[i]
来表示每一天的三种状态的最大收益。 - 使用递推公式更新这三种状态的值。
- 最终结果为
max(sell[n-1], cooldown[n-1])
,即在最后一天没有持有股票时的最大收益。
伪代码:
initialize hold[0] = -prices[0], sell[0] = 0, cooldown[0] = 0
for each day i from 1 to n-1:hold[i] = max(hold[i-1], sell[i-1] - prices[i])cooldown[i] = hold[i-1] + prices[i]sell[i] = max(sell[i-1], cooldown[i-1])
return max(sell[n-1], cooldown[n-1])
4. 进一步优化
- 空间优化:由于
dp[i]
仅依赖于dp[i-1]
,我们可以将动态规划中的hold
、cooldown
和sell
状态用常量来代替,从而将空间复杂度优化到O(1)
。
5. 小总结
- 问题思路:通过将状态分为持有股票、未持有且处于冷冻期、未持有且不在冷冻期三种情况,动态规划可以清晰地描述问题的状态转移过程。
- 时间复杂度:该算法的时间复杂度为
O(n)
,空间复杂度可以优化为O(1)
。
以上就是买卖股票的最佳时机含冷冻期问题的基本思路。
Python代码
class Solution:def maxProfit(self, prices: list[int]) -> int:if not prices:return 0n = len(prices)# 初始化第0天的状态hold = -prices[0]sell = 0cooldown = 0for i in range(1, n):# 更新状态new_hold = max(hold, sell - prices[i])new_cooldown = hold + prices[i]new_sell = max(sell, cooldown)# 更新hold, cooldown, sellhold, cooldown, sell = new_hold, new_cooldown, new_sell# 返回sell和cooldown中的较大值return max(sell, cooldown)
Python代码解释总结
- 初始化:在第 0 天,如果持有股票,则收益为
-prices[0]
,否则为0
。 - 状态转移:通过递推公式更新每一天的
hold
、cooldown
和sell
状态。 - 返回结果:在最后一天,返回不持有股票状态下的最大收益,即
max(sell, cooldown)
。
C++代码
#include <vector>
#include <algorithm>
using namespace std;class Solution {
public:int maxProfit(vector<int>& prices) {if (prices.empty()) return 0;int n = prices.size();// 初始化第0天的状态int hold = -prices[0];int sell = 0;int cooldown = 0;for (int i = 1; i < n; ++i) {// 更新状态int new_hold = max(hold, sell - prices[i]);int new_cooldown = hold + prices[i];int new_sell = max(sell, cooldown);// 更新hold, cooldown, sellhold = new_hold;cooldown = new_cooldown;sell = new_sell;}// 返回sell和cooldown中的较大值return max(sell, cooldown);}
};
C++代码解释总结
- 初始化:在第 0 天,如果持有股票,则收益为
-prices[0]
,否则为0
。 - 状态转移:通过递推公式更新每一天的
hold
、cooldown
和sell
状态。 - 返回结果:在最后一天,返回不持有股票状态下的最大收益,即
max(sell, cooldown)
。
总结
- 核心思想:通过将买卖股票问题划分为持有股票、未持有且处于冷冻期、未持有且不在冷冻期三种状态,动态规划可以清晰地模拟问题的状态转移过程。
- 时间复杂度:该算法的时间复杂度为
O(n)
,可以处理大规模的输入。 - 空间优化:由于每个状态只依赖前一天的状态,空间复杂度可以从
O(n)
优化为O(1)
。
相关文章:

【LeetCode】动态规划—309. 买卖股票的最佳时机含冷冻期(附完整Python/C++代码)
动态规划—309. 买卖股票的最佳时机含冷冻期 题目描述前言基本思路1. 问题定义2. 理解问题和递推关系状态定义:状态转移公式:初始条件: 3. 解决方法动态规划方法伪代码: 4. 进一步优化5. 小总结 Python代码Python代码解释总结 C代…...

IDE启动失败
报错:Cannot connect to already running IDE instance. Exception: Process 24,264 is still running 翻译:无法连接到已运行的IDE实例。异常:进程24,264仍在运行 打开任务管理器,找到PID为24264的CPU线程,强行结束即可。 【Ct…...

【Kubernetes】常见面试题汇总(六十)
目录 131. pod 一直处于 pending 状态? 132. helm 安装组件失败? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题目 69-113 属于…...

maven dependency中scope的取值类型
在 Maven 中,<scope> 标签用于定义依赖项的范围,以指定依赖在不同阶段的可见性和生命周期。以下是 Maven 中常见的 <scope> 取值类型的详细介绍: 1. **compile**: - 默认的依赖范围,适用于编译、测试和…...

线性代数在大一计算机课程中的重要性
线性代数在大一计算机课程中的重要性 线性代数是一门研究向量空间、矩阵运算和线性变换的数学学科,在计算机科学中有着广泛的应用。大一的计算机课程中,线性代数的学习为学生们掌握许多计算机领域的关键概念打下了坚实的基础。本文将介绍线性代数的基本…...

笔记本电脑按住电源键强行关机,对电脑有伤害吗?
电脑卡住了,我们习惯性地按住电源键或者直接拔掉电源强制关机,但这种做法真的安全吗?会不会对电脑造成伤害呢? 其实,按住电源键关机和直接拔掉电源关机是不一样的。它们在硬件层面有着本质区别。 按住电源键关机 当…...

如何将 cryptopp库移植到UE5内
cryptopp是一个开源免费的算法库,这个库的用途非常多,我常常用这个库来做加解密的运算。这段时间在折腾UE5.4.4,学习的过程中,准备把cryptopp移植到游戏的工程内,但UE的编译环境和VS的编译环境完全不同,能在…...

SpringBoot 集成GPT实战,超简单详细
Spring AI 介绍 在当前的AI应用开发中,像OpenAI这样的GPT服务提供商主要通过HTTP接口提供服务,这导致大部分Java开发者缺乏一种标准化的方式来接入这些强大的语言模型。Spring AI Alibaba应运而生,它作为Spring团队提供的一个解决方案&…...

基于Langchain框架下Prompt工程调教大模型(LLM)[输入输出接口、提示词模板与例子选择器的协同应用
大家好,我是微学AI,今天给大家介绍一下基于Langchain框架下Prompt工程调教大模型(LLM)[输入输出接口、提示词模板与例子选择器的协同应用。本文深入探讨了Langchain框架下的Prompt工程在调教LLM(大语言模型)方面的应用,…...

Vue基于vue-office实现docx、xlsx、pdf文件的在线预览
文章目录 1、vue-office概述2、效果3、实现3.1 安装3.2 使用示例3.2.1 docx文档的预览3.2.2 excel文档预览3.2.3 pdf文档预览1、vue-office概述 vue-office是一个支持多种文件(docx、.xlsx、pdf)预览的vue组件库,支持vue2和vue3。 功能特色: 一站式:提供docx、.xlsx、pdf多…...

哪个软件可以在线编辑ppt? 一口气推荐5个做ppt的得力助手!
日常在制作ppt时,你是否经常遇到这些问题,ppt做到一半,电脑突然死机,来不及保存的ppt付之一炬,分分钟让人原地崩溃…… 好在许多团队也在持续跟进这个问题,给出了一个一劳永逸的最佳方案——PPT在线编辑&a…...

Django学习笔记九:Django中间件Middleware
Django中间件(Middleware)是一段在Django的请求/响应处理过程中,可以介入并改变请求或响应的代码。中间件是Django框架中一个非常强大的功能,它允许你在Django的视图函数之前或之后执行自定义代码。 中间件可以用于: …...

原来自媒体高手都是这样选话题的,活该人家赚大钱,真后悔知道晚了
做自媒体,话题是战略,内容是战术。 战略是要做正确的事情,战术是如何正确地做事。 如果战略上错误,战术上再勤奋努力都无济于事。 《孙子兵法》有云:“胜者先胜而后求战,败者先战而后求胜。” 相信很多…...

胤娲科技:AI绘梦师——一键复刻梵高《星空》
想象一下,你手中握有一张梵高的《星空》原图,只需轻轻一点,AI便能化身绘画大师,一步步在画布上重现那璀璨星河。 这不是科幻电影中的桥段,而是华盛顿大学科研团队带来的“Inverse Painting”项目,正悄然改变…...

第18课-C++继承:探索面向对象编程的复用之道
一、引言 C 作为一种强大的编程语言,继承机制在面向对象编程中扮演着至关重要的角色。它允许开发者基于已有的类创建新的类,从而实现代码的复用和功能的扩展。然而,继承的概念和使用方法并非一目了然,特别是在处理复杂的继承关系时…...

麒麟V10系统下的调试工具(网络和串口调试助手)
麒麟V10系统下的调试工具(网络和串口调试助手) 1.安装网络调试助手mnetassist arm64-main ①在linux下新建一个文件夹 mkdir /home/${USER}/NetAssist②将mnetassist arm64-main.zip拷贝到上面文件夹中,并解压给权限 cd /home/${USER}/Ne…...

ssh封装上传下载
pip install paramiko import paramikoclass SSHClient:def __init__(self, host, port, username, password):self.host = hostself.port = portself.username = usernameself.password = passwordself.ssh = Noneself.sftp = Nonedef connect(self):"""连接到…...

018_FEA_Structure_Static_in_Matlab结构静力学分析
刹车变形分析 本示例展示了如何使用 MATLAB 软件进行刹车变形分析。 这个例子是Matlab官方PDE工具箱的第一个例子,所需要的数据文件都由Matlab提供,包括CAD模型文件。 步骤 1: 导入 CAD 模型 导入 CAD 模型,这里使用的是一个带有孔的支架模…...

网页打不开、找不到服务器IP地址
现象:网络连接ok,软件能正常使用,当网页打不开。 原因:DNS 配置错误导致网站域名无法正确解析造成。 影响DNS设置的:VPN软件、浏览器DNS服务选择、IPv4属性被修改。 1、VPN代理未关闭 2、浏览器DNS解析选择 3、以太…...

RUM性能优化之图片加载
作者:三石 在现代Web开发中,图片作为内容表达的核心元素,其加载效率直接影响到页面的整体性能和用户体验。随着高清大图和动态图像的普及,优化图片加载变得尤为重要。RUM作为一种主动监测技术,能够帮助开发者从真实用户…...

【Java】—— 泛型:泛型的理解及其在集合(List,Set)、比较器(Comparator)中的使用
目录 1. 泛型概述 1.1 生活中的例子 1.2 泛型的引入 2. 使用泛型举例 2.1 集合中使用泛型 2.1.1 举例 2.1.2 练习 2.2 比较器中使用泛型 2.2.1 举例 2.2.2 练习 1. 泛型概述 1.1 生活中的例子 举例1:中药店,每个抽屉外面贴着标签 举例2&…...

【Python】selenium遇到“InvalidArgumentException”的解决方法
在使用try……except 的时候捕获到这个错误: InvalidArgumentException: invalid argument (Session info: chrome112.0.5614.0) 这个错误代表的是,当传入的参数不符合期望时,就会抛出这个异常: InvalidArgumentException: invali…...

RT-DETR改进策略:BackBone改进|CAFormer在RT-DETR中的创新应用,显著提升目标检测性能
摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入RT-DETR模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…...

【YOLOv11】ultralytics最新作品yolov11 AND 模型的训练、推理、验证、导出 以及 使用
目录 一 ultralytics公司的最新作品YOLOV11 1 yolov11的创新 2 安装YOLOv11 3 PYTHON Guide 二 训练 三 验证 四 推理 五 导出模型 六 使用 文档:https://docs.ultralytics.com/models/yolo11/ 代码链接:https://github.com/ultralytics/ult…...

动态规划——多状态动态规划问题
目录 一、打家劫舍 二、打家劫舍 II 三、删除并获得点数 四、粉刷房子 五、买卖股票的最佳时机含冷冻期 六、买卖股票的最佳时机含手续费 七、买卖股票的最佳时机III 八、买卖股票的最佳时机IV 一、打家劫舍 打家劫舍 第一步:确定状态表示 当我们每次…...

leetcode-10/9【堆相关】
1.数组中的第K个最大元素【215】 思路: 1.1.要使得时间复杂度为O(n),自己实现大顶堆,通过K次调整,顶部元素就是想要的第K个最大元素 1.2.实现大顶堆的过程中,先建堆,建堆是利用递归,本…...

自然语言处理问答系统:技术进展、应用与挑战
自然语言处理问答系统:技术进展、应用与挑战 自然语言处理(NLP)作为人工智能领域的一个重要分支,旨在使计算机能够理解和生成人类语言。问答系统(Q&A System),作为NLP的一个重要应用&#…...

向量数据库!AI 时代的变革者还是泡沫?
向量数据库!AI 时代的变革者还是泡沫? 前言一、向量数据库的基本概念和原理二、向量数据库在AI中的应用场景三、向量数据库的优势和挑战四、向量数据库的发展现状和未来趋势五、向量数据库对AI发展的影响 前言 数据是 AI 的核心,而向量则是数…...

vue中css作用域及深度作用选择器的用法
Vue中有作用域的CSS 当< style>标签有scoped属性时,它的css只作用于当前组建中的元素。vue2和vue3均有此用法; 当使用scoped后,父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受父组件有作用域的css和子组件有作用…...

LLM - 使用 ModelScope SWIFT 测试 Qwen2-VL 的 LoRA 指令微调 教程(2)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142827217 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 SWIFT …...