LeetCode题解:股票买卖问题
初始化:创建一个二维数组dp,保存每个交易次数k的最大利润。 遍历每一天:对于每一天,更新每个k的状态。 更新状态:根据状态转移方程,计算当前天的利润。 处理手续费:在卖出时扣除手续费。 返回结果:最后一天不持有股票的最大利润即为答案。
发布日期:2021-04-30 21:03:29
浏览次数:100
分类:精选文章
本文共 1334 字,大约阅读时间需要 4 分钟。
股票交易最大利润问题
在股票交易问题中,我们的目标是通过买入和卖出股票来获得最大利润。允许的最大交易次数为K次,这意味着我们可以进行多次买卖,但每次交易必须等待至少一天才能进行下一次交易。
以下是解决该问题的详细步骤:
问题分析
我们需要设计一个算法来计算在允许最多K次交易的情况下,能够获得的最大利润。每次交易包括买入和卖出,且卖出后必须等待至少一天才能再次买入。手续费的影响也需要考虑进去。
动态规划方法
我们可以使用动态规划来解决这个问题。定义状态dp[i][k][s],其中:
- i表示第i天。
- k表示到目前为止完成的交易次数。
- s表示当前是否持有股票(s=1表示持有,s=0表示不持有)。
状态转移方程如下:
- 如果不持有股票(s=0):dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
- 如果持有股票(s=1):dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])
边界条件:
- dp[-1][k][0] = 0
- dp[-1][k][1] = -∞
- dp[i][0][0] = 0
- dp[i][0][1] = -∞
优化空间复杂度
为了优化空间复杂度,我们可以使用滚动数组的方法。只需保存前一天和当前一天的状态,而无需保存所有天数的状态。
实现步骤
代码实现
以下是Python代码实现,考虑了手续费的影响:
class Solution: def maxProfit(self, k, prices): if not prices: return 0 n = len(prices) if k == 0: return 0 dp = [[0] * 2 for _ in range(k + 1)] for i in range(1, n): for j in range(k, 0, -1): buy = dp[j-1][0] - prices[i] dp[j][0] = max(dp[j][0], buy) sell = dp[j][1] + prices[i] dp[j][1] = max(dp[j][1], sell) return max(dp[k][0], dp[k][1])
总结
通过动态规划,我们可以有效地解决股票交易最大利润问题。状态转移方程明确了每次交易的决策,而滚动数组优化了空间复杂度,使得算法在时间和空间上都非常高效。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2026年06月20日 07时11分02秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PinYin4j库的使用
2023-03-02
PIP
2023-03-02
pip install mysqlclient报错
2023-03-02
pip install 出现报asciii码错误的解决
2023-03-02
pip throws TypeError: parse() got an unexpected keyword argument ‘transport_encoding‘ 在尝试安装新软件包时
2023-03-02
pip 下载慢
2023-03-02
pip 安装opencv-python卡死
2023-03-02
pip 安装出现异常
2023-03-02
Pip 安装失败:需要 SSL
2023-03-02
Pip 安装挂起
2023-03-02
pip 或 pip3 为 Python 3 安装包?
2023-03-02
pip 无法从 requirements.txt 安装软件包
2023-03-02
pip/pip3更换国内源
2023-03-02
pip3 install PyQt5 --user 失败
2023-03-02
pip3命令全解析:Python3包管理工具的详细使用指南
2023-03-02
PIPE 接口信号列表
2023-03-02