代码随想录训练营 Day41打卡 动态规划 part08 121. 买卖股票的最佳时机 122. 买卖股票的最佳时机II 123. 买卖股票的最佳时机III

代码随想录训练营 Day41打卡 动态规划 part08

一、力扣121. 买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

在这个问题中,我们需要计算在给定的股票价格数组 prices 中,最多只能进行一次交易(即一次买入和一次卖出)的情况下,能够获得的最大利润。为了实现这一点,我们使用动态规划的方法来模拟整个买卖过程。

我们定义两个状态:

  • dp[i][0] 表示第 i 天持有股票时能够获得的最大现金金额。
  • dp[i][1] 表示第 i 天不持有股票时能够获得的最大现金金额。

注意,“持有股票”不一定表示当天买入股票,也可能是之前买入的,并且持续持有到当天。同样地,“不持有股票”可以是当天卖出股票,或者之前已经卖出并且保持不持有状态。

持有股票时 (dp[i][0]):

如果第 i-1 天已经持有股票,那么保持现状:dp[i - 1][0]。
如果第 i 天买入股票,那么所得现金为 -prices[i]。
公式:dp[i][0] = max(dp[i - 1][0], -prices[i])

不持有股票时 (dp[i][1]):

如果第 i-1 天已经不持有股票,那么保持现状:dp[i - 1][1]。
如果第 i 天卖出股票,那么所得现金为 prices[i] + dp[i - 1][0]。
公式:dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0])
以示例输入:[7,1,5,3,6,4]为例,dp数组状态如下:
在这里插入图片描述
dp[5][1]就是最终结果。

为什么不是dp[5][0]呢?

因为本题中不持有股票状态所得金钱一定比持有股票状态得到的多!

代码实现

class Solution:def maxProfit(self, prices: List[int]) -> int:length = len(prices)if length == 0:return 0# 初始化 dp 数组,大小为 [length][2]# dp[i][0] 表示第 i 天持有股票时的最大现金# dp[i][1] 表示第 i 天不持有股票时的最大现金dp = [[0] * 2 for _ in range(length)]# 初始化第一天的状态dp[0][0] = -prices[0]  # 第 0 天买入股票dp[0][1] = 0  # 第 0 天不持有股票# 动态规划,计算每一天的状态for i in range(1, length):# 第 i 天持有股票的最大现金dp[i][0] = max(dp[i - 1][0], -prices[i])# 第 i 天不持有股票的最大现金dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0])# 最终结果是最后一天不持有股票时的最大现金return dp[-1][1]

力扣题目链接
题目文章讲解
题目视频讲解

二、力扣122. 买卖股票的最佳时机II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
示例
输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。
最大总利润为 4 + 3 = 7 。

在这个问题中,我们需要找到一个策略,使得通过多次交易(买入和卖出股票)能够获得的最大利润。与之前只能进行一次交易的情况不同,这里允许在多个不同的时间点进行多次交易,每次交易只能持有一股股票。

我们仍然使用动态规划来解决这个问题。我们定义两个状态:

dp[i][0] 表示第 i 天持有股票时能够获得的最大现金金额。
dp[i][1] 表示第 i 天不持有股票时能够获得的最大现金金额。

与只能进行一次交易不同,这里第 i 天买入股票的现金金额可以是前一天不持有股票时的现金减去今天的股票价格,即 dp[i-1][1] - prices[i]。

持有股票时 (dp[i][0]):

如果第 i-1 天已经持有股票,那么保持现状:dp[i-1][0]。
如果第 i 天买入股票,那么所得现金为前一天不持有股票的现金减去今天的股票价格:dp[i-1][1] - prices[i]。
公式:dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i])

不持有股票时 (dp[i][1]):

如果第 i-1 天已经不持有股票,那么保持现状:dp[i-1][1]。
如果第 i 天卖出股票,那么所得现金为今天的股票价格加上前一天持有股票的现金:dp[i-1][0] + prices[i]。
公式:dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])

代码实现

class Solution:def maxProfit(self, prices: List[int]) -> int:length = len(prices)# 特殊情况处理if length == 0:return 0# 初始化 dp 数组,大小为 [length][2]# dp[i][0] 表示第 i 天持有股票时的最大现金# dp[i][1] 表示第 i 天不持有股票时的最大现金dp = [[0] * 2 for _ in range(length)]# 初始化第一天的状态dp[0][0] = -prices[0]  # 第 0 天买入股票dp[0][1] = 0  # 第 0 天不持有股票# 动态规划,计算每一天的状态for i in range(1, length):# 第 i 天持有股票的最大现金dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i])# 第 i 天不持有股票的最大现金dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])# 最终结果是最后一天不持有股票时的最大现金return dp[-1][1]

力扣题目链接
题目文章讲解
题目视频讲解

二、力扣123. 买卖股票的最佳时机III

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例
输入:prices = [3,3,5,0,0,3,1,4]
输出:6
解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。
随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。

在这个问题中,我们需要找到一个策略,通过最多两次交易(即最多买入两次和卖出两次)来获得最大利润。每次交易只能持有一股股票,因此有五种状态:

dp[i][0]:表示第 i 天没有任何操作或不进行任何交易时的最大利润。
dp[i][1]:表示第 i 天进行了第一次买入操作后的最大利润。
dp[i][2]:表示第 i 天进行了第一次卖出操作后的最大利润。
dp[i][3]:表示第 i 天进行了第二次买入操作后的最大利润。
dp[i][4]:表示第 i 天进行了第二次卖出操作后的最大利润。

dp[i][1]: 第 i 天持有股票(第一次买入)的最大利润:
如果第 i 天买入股票:dp[i-1][0] - prices[i]。
如果第 i 天不买入股票:dp[i-1][1]。
公式:dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])

dp[i][2]: 第 i 天不持有股票(第一次卖出)的最大利润:
如果第 i 天卖出股票:dp[i-1][1] + prices[i]。
如果第 i 天不卖出股票:dp[i-1][2]。
公式:dp[i][2] = max(dp[i-1][2], dp[i-1][1] + prices[i])

dp[i][3]: 第 i 天持有股票(第二次买入)的最大利润:
如果第 i 天买入股票:dp[i-1][2] - prices[i]。
如果第 i 天不买入股票:dp[i-1][3]。
公式:dp[i][3] = max(dp[i-1][3], dp[i-1][2] - prices[i])

dp[i][4]: 第 i 天不持有股票(第二次卖出)的最大利润:
如果第 i 天卖出股票:dp[i-1][3] + prices[i]。
如果第 i 天不卖出股票:dp[i-1][4]。
公式:dp[i][4] = max(dp[i-1][4], dp[i-1][3] + prices[i])

dp数组初始化

dp[0][0] = 0:表示第 0 天不进行任何操作,利润为 0。
dp[0][1] = -prices[0]:表示第 0 天第一次买入股票后的利润,即减去第 0 天的股票价格。
dp[0][2] = 0:表示第 0 天第一次卖出股票后的利润,因为不能卖出不存在的股票,所以利润为 0。
dp[0][3] = -prices[0]:表示第 0 天第二次买入股票后的利润,即再减去第 0 天的股票价格。
dp[0][4] = 0:表示第 0 天第二次卖出股票后的利润,同理也为 0。

代码实现

class Solution:def maxProfit(self, prices: List[int]) -> int:# 特殊情况处理,如果没有股票价格数据,返回 0if len(prices) == 0:return 0# 初始化 dp 数组,大小为 [len(prices)][5]dp = [[0] * 5 for _ in range(len(prices))]# 第 0 天的状态初始化dp[0][0] = 0  # 不操作dp[0][1] = -prices[0]  # 第一次买入dp[0][2] = 0  # 第一次卖出dp[0][3] = -prices[0]  # 第二次买入dp[0][4] = 0  # 第二次卖出# 动态规划,遍历每一天的状态for i in range(1, len(prices)):# 第 i 天不操作的状态,延续前一天的状态dp[i][0] = dp[i-1][0]# 第 i 天第一次买入股票的状态dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])# 第 i 天第一次卖出股票的状态dp[i][2] = max(dp[i-1][2], dp[i-1][1] + prices[i])# 第 i 天第二次买入股票的状态dp[i][3] = max(dp[i-1][3], dp[i-1][2] - prices[i])# 第 i 天第二次卖出股票的状态dp[i][4] = max(dp[i-1][4], dp[i-1][3] + prices[i])# 最终返回的结果是最后一天,第二次卖出股票后的最大利润return dp[-1][4]

力扣题目链接
题目文章讲解
题目视频讲解

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全总结②

上一篇:网络安全总结① 下一篇: 传统防火墙 传统防火墙 技术:访问控制、代理技术、会话机制 工作层次:应用层一下 防御模式:通过防御设备划分边界,基于IP/端口和特征进行判断;以隔离为基础&am…

java Boss直聘爬虫数据分析

摘要 本报告利用Java和Selenium爬虫技术获取数据,并使用ECharts库对薪资数据进行可视化分析,旨在探究不同经验和学历的薪资分布情况。 数据来源 数据来源于Boss直聘,使用Java结合Selenium库进行数据抓取。 数据总数:约2000家企…

LeetCode --- 411周赛

题目列表 3258. 统计满足 K 约束的子字符串数量 I 3259. 超级饮料的最大强化能量 3260. 找出最大的 N 位 K 回文数 3261. 统计满足 K 约束的子字符串数量 II 一、统计满足K约束的子字符串数量I 这种要求满足区间内某种性质的题,一般都可以用滑动窗口来做。这题…

黄河:曾月入十几万,被裁后做独立开发,我每天必须要做的事就是写代码

这是《开发者说》的第16期,本期我们邀请的开发者是黄河,来自西北城市银川,半路转行为程序员,靠着自己对编程的热爱,一路坚持下来,虽地处偏远,正是得益于互联网的好处,让全球每一个角…

畅捷通CRM newleadset.php SQL注入漏洞复现

0x01 产品简介 用友畅捷通CRM是面向小企业全力打造的简单、实用的客户关系管理应用。帮助企业用好自己的客户资源、管好商机跟进过程、引导好业务员跟单行为,促进团队销售能力的提升;通过查询和分析,识别企业的价值客户,融合电话、短信、邮件等工具,实现精准营销;帮助企…

网络安全之渗透测试实战-DC-3-靶机入侵

一、下载靶机DC-3,解压后导入Vmware Workstation https://pan.baidu.com/s/17BcSH6RqC7wuyB7PRNqOow?pwdkc12启动DC-3靶机,由于不知道密码,无需登录 二、靶机的网卡采用的是NAT模式自动获取IP地址,此时我们需要先获取其MAC地址…

Qt:鼠标事件

虽然Qt是跨平台的c开发框架,但是Qt的很多能力是系统提供的,只是其封装了系统的API,例如在Linux环境下的Qt就封装了Linux的一堆API 系统API 事件:图形化界面中,用户操作和程序之间交互的机制(封装了系统的事…

机器学习:DBSCAN算法(内有精彩动图)

目录 前言 一、DBSCAN算法 1.动图展示(图片转载自网络) 2.步骤详解 3.参数配置 二、代码实现 1.完整代码 2.代码详解 1.导入数据 2.通过循环确定参数最佳值 总结 前言 DBSCAN(Density-Based Spatial Clustering of Applications w…

探索数据结构:图(三)之最短路径算法

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 最短路径算法 最短路径问题可分为单源最短路径和多源最短路径。其指…

《机器学习》 SVM支持向量机 推导、参数解析、可视化实现

目录 一、SVM支持向量机 1、什么是SVM 例如: 2、SVM的主要特点是: 二、SVM方程 1、超平面方程 2、标签问题 3、决策函数: 符号函数: 整合: 4、距离问题 1)点到直线距离 2)点到平面…

航空公司名字趣史:看看有趣又有意义的命名背后有什么玄机

上周“东海航空”事件引发了东方航空在社交媒体上的一系列被迫营业,因为媒体的乌龙报道误将“东海航空”简称为“东航”,甚至直接用错了图片。众号:标猿公司起名 给公司起个好名字 其实除了大部分以地域、国家命名的航空公司,还…

Android Auto推出全新Google助手设计

智能手机与汽车的无缝整合已成为现代驾驶的重要组成部分,而 Android Auto 一直在这一领域处于领先地位。谷歌通过不断推出新功能和更新,体现了其致力于提升 Android Auto 体验的决心。最近,Android Auto 引入了 Google助手的全新设计。 当系…

【Qt】多元素控件QTreeWidget

多元素控件QTreeWidget 使用QTreeWidget表示一个树型结构,里面的每一个元素都是QTreeWidgetItem,每个QTreeWidgetItem可以包含多个文本和图标,每个文本/图标表示一列。 可以给QTreeWidget设置顶层结构(顶层节点可以有多个&#…

redis面试(二十二)读锁释放

假设现在已经有各种锁的重入什么的,那如何释放锁? 读锁读锁 假如说,同一个线程多次加读锁,或者不同的线程加了多个读锁 当前的锁结构长这样 anyLock: { “mode”: “read”, “UUID_01:threadId_01”: 2, “UUID_02:threadId_02…

去雾去雨算法

简单版 import cv2 import numpy as npdef dehaze(image):"""简单去雾算法,使用直方图均衡化来增强图像"""# 将图像转换为YUV颜色空间yuv_image cv2.cvtColor(image, cv2.COLOR_BGR2YUV)# 对Y通道(亮度)进行…

数据结构——队的基本操作

一、顺序队 队的用法:先进先出 跟平时我们遇到的大多情况一样,队的主要思想就是先进先出,比如我去食堂打饭,我先排那么就是我先打到饭咯 顺序队:其实说白了就是一块空间用两个指针去指向,为了实现先进先…

C语言指针重学

学习要纲:建议掌握 gdb调试(b ,d ,fin ,bt ,print ,awatch ,up ,down ,set pretty等) SourceInsight软件看代码(全局搜索 文件搜索等) git如何调取分支合并(git branch,git blame,git log,git pull,git reset --hard等) 等内容,下面是对于指针的一个重新学习. C语言的指针&…

AI工具 GPT 学术优化 (GPT Academic) 安装实践

GPT 学术优化 (GPT Academic)是一个综合的AI GPT工具包,可以完成各种gpt辅助的工作,比如代码解读、翻译、读论文等功能。官网:GitHub - binary-husky/gpt_academic: 为GPT/GLM等LLM大语言模型提供实用化交互接口,特别优化论文阅读…

2024年中国运筹学会运筹竞赛(数据驱动赛道)报名通知

竞赛组织 主办单位:中国运筹学会(国家一级学会) 承办单位:中国科学技术大学 支持单位:杉数科技、海康威视、中国科学技术大学管理学院、《运筹学学报》杂志 竞赛内容 本次竞赛(本科生组)由竞…

BOSS直聘财报:2024年第二季度净利润4.17亿元,同比上涨34.8%

8月28日美股盘前,BOSS直聘(NASDAQ:BZ,HK:2076)发布了2024年第二季度财报。在第二季度,公司经营效率不断提升,非通用会计准则下,取得净利润4.17亿元,同比上涨34.8%。 第二季度,公司持…