LeetCode题解:股票买卖问题
发布日期: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] = -∞

优化空间复杂度

为了优化空间复杂度,我们可以使用滚动数组的方法。只需保存前一天和当前一天的状态,而无需保存所有天数的状态。

实现步骤

  • 初始化:创建一个二维数组dp,保存每个交易次数k的最大利润。
  • 遍历每一天:对于每一天,更新每个k的状态。
  • 更新状态:根据状态转移方程,计算当前天的利润。
  • 处理手续费:在卖出时扣除手续费。
  • 返回结果:最后一天不持有股票的最大利润即为答案。
  • 代码实现

    以下是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])

    总结

    通过动态规划,我们可以有效地解决股票交易最大利润问题。状态转移方程明确了每次交易的决策,而滚动数组优化了空间复杂度,使得算法在时间和空间上都非常高效。

    上一篇:Leetcode--12. 整数转罗马数字
    下一篇:Leetcode--139. 单词拆分

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2026年06月20日 07时11分02秒