青训营X豆包MarsCode 技术训练营第六课 | 豆包MarsCode AI 刷题

46 阅读2分钟

股票市场交易策略优化

这段代码是用来解决股票交易中的最大利润问题,具体解释如下:

首先,定义两个数组 hold 和 unhold,它们分别表示在第 i 天持有股票和不持有股票时的最大利润。

  • hold[i] 表示在第 i 天结束时,小R持有股票时的最大利润。
  • unhold[i] 表示在第 i 天结束时,小R不持有股票时的最大利润。

接下来,初始化这两个数组:

  • hold[0] = -stocks[0]:表示第一天买入股票,利润为负的股票价格。
  • unhold[0] = 0:表示第一天不买入股票,利润为0。

然后,通过遍历股票价格数组,更新 hold 和 unhold 数组:

  • hold[i] = max(hold[i-1], unhold[i-2] - stocks[i] if i >= 2 else -stocks[i])

    • hold[i-1] 表示第 i 天继续持有前一天的股票。
    • unhold[i-2] - stocks[i] 表示在第 i 天买入股票,前提是前一天不是卖出股票的日子(因为存在一天的冷冻期),即第 i-2 天不持有股票。
    • 如果 i < 2,即前两天内,可以直接买入股票,因此是 -stocks[i]
  • unhold[i] = max(unhold[i-1], hold[i-1] + stocks[i])

    • unhold[i-1] 表示第 i 天继续不持有股票。
    • hold[i-1] + stocks[i] 表示在第 i 天卖出股票,即前一天持有股票,并在第 i 天卖出。

最后,返回 unhold[-1],即在最后一天结束时,小R不持有股票的最大利润,这将是整个交易期间的最大利润。

这个算法的时间复杂度是 O(n),空间复杂度也是 O(n),其中 n 是股票价格数组的长度。

    def solution(stocks):
# Please write your code here
if not stocks:
    return 0
n=len(stocks)
hold =[0]*n
unhold = [0]*n

hold[0]=-stocks[0]
unhold[0]=0

for i in range(1,n):
    hold[i]=max(hold[i-1],unhold[i-2]-stocks[i] if i>=2 else -stocks[i])
    unhold[i] = max(unhold[i-1],hold[i-1]+stocks[i])
return unhold[-1]