买卖股票的最佳时机 III

举报
程序员学长 发表于 2022/01/24 22:29:19 2022/01/24
【摘要】 买卖股票的最佳时机 III读前福利,送大家一些电子书123. 买卖股票的最佳时机 III 问题描述给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成两笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 分析问题这个题目和上个题相比,状态又发生了变化,这里因为限制了交易次数,所以我们需要把交易次...

买卖股票的最佳时机 III

读前福利送大家一些电子书

123. 买卖股票的最佳时机 III

问题描述

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成两笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

分析问题

这个题目和上个题相比,状态又发生了变化,这里因为限制了交易次数,所以我们需要把交易次数的状态也保存起来。所以每天交易结束后,有5种状态。

  1. 未进行过任何操作。

  2. 只进行过一次买入操作。

  3. 进行过一次买入和卖出操作。

  4. 完成一笔的交易前提下,进行了第二次买入操作。

  5. 完成两笔交易。

    由于第一个状态的利润为0,所以我们不需要记录。我们把剩下的4个状态分别用buy1,sell1,buy2,sell2来表示。下面我们来看一下如何根据前一天的状态,来通过转移方程生成今天的4个状态。

​ 对于buy1而言,我们可以今天不操作,直接通过昨天的buy1转移过来,或者我们从未进行过任何操作前提下,今天买入股票。

​ buy1 =max(buy1,-prices[i])

​ 对于sell1而言,我们今天可以不做任何操作,直接通过昨天的sell1转移过来,或者我们可以在只进行过一次买入交易的前提下,今天把股票卖出。

​ sell1=max(sell1,buy1+prices[i])

​ 对于buy2而言,我们今天可以不做任何操作,直接通过昨天的buy2转移过来,或者,我们在进行过一笔完成的交易条件下,今天再把该股票买入。

​ buy2=max(buy2,sell1-prices[i])

​ 对于sell2而言,我们今天可以不做任何操作,直接通过昨天的sell2 转移过来,或者,我们在buy2的前提下,今天把股票卖出。即

​ sell2=max(sell2,buy2+prices[i])

Tips:我们在计算sell1时,我们可以直接使用buy1而不是buy1进行转移。buy1比buy1多考虑的是在第i天买入股票的情况,而转移到sell1时,考虑的是在第i天卖出股票的情况,这样在同一天买入并且卖出股票的收益为0,不会对结果产生影响。对于buy2和sell2也是同样的考虑,我们可以直接用第i天求出的值来进行转移。

{ b u y 1 = m a x ( b u y 1 , p r i c e s [ i ] ) s e l l 1 = m a x ( s e l l 1 , b u y 1 + p r i c e s [ i ] b u y 2 = m a x ( b u y 2 , s e l l 1 p r i c e [ i ] ) s e l l 2 = m a x ( s e l l 2 , b u y 2 + p r i c e s [ i ] ) \begin{cases} buy1=max(buy1,-prices[i])\\ sell1=max(sell1,buy1+prices[i]\\buy2=max(buy2,sell1-price[i])\\sell2=max(sell2,buy2+prices[i]) \end{cases}

我们来看代码实现:

def maxProfit(prices):
    n = len(prices)
    #表示以prices[0]买入股票
    buy1=-prices[0]
    #表示在同一天买入并且卖出,即为0
    sell1=0
    #表示同一天买入卖出后再以prices[0]的价格买入
    buy2=-prices[0]
    #表示同一天买入卖出两次,即为0
    sell2 = 0
    for i in range(1, n):
        buy1 = max(buy1, -prices[i])
        sell1 = max(sell1, buy1 + prices[i])
        buy2 = max(buy2, sell1 - prices[i])
        sell2 = max(sell2, buy2 + prices[i])
    return sell2

prices=[7, 1, 5, 3, 6, 4]
print(maxProfit(prices))
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。