📅  最后修改于: 2023-12-03 14:55:17.827000             🧑  作者: Mango
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [3,3,5,0,0,3,1,4] 输出: 6 解释: 在第 4 天(股票价格 = 0)的时候买入, 在第 6 天(股票价格 = 3)的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。
随后,在第 7 天(股票价格 = 1)的时候买入, 在第 8 天 (股票价格 = 4)的时候卖出, 这笔交易所能获得利润 = 4-1 = 3 。
我们可以用一个 4 位的数组来表示在不同的状态下持有股票和累计利润的情况。
我们用 buy1
表示第一次买入的最大利润,用 sell1
表示第一次卖出的最大利润,用 buy2
表示第二次买入的最大利润,用 sell2
表示第二次卖出的最大利润。
对于每个证券价格,我们有四个选择:买入第一个股票,当前收益为负;将第一个股票卖出,当前收益为当前价格加上第一个交易中的收益;第二次买入证券,当前收益为第一个交易的收益减去当前价格;第二次卖出股票,当前收益为当前价格加上第二个交易中的收益。我们将每个操作之后的最大收益存储在相应的变量中,最终 sell2 就是最大交易利润。
Python 代码片段:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
buy1 = buy2 = float('inf')
sell1 = sell2 = 0
for price in prices:
buy1 = min(buy1, price) # 第一次买入的最小价格
sell1 = max(sell1, price - buy1) # 第一次卖出的最大收益
buy2 = min(buy2, price - sell1) # 第二次买入时扣除第一次的收益后的最小价格
sell2 = max(sell2, price - buy2) # 第二次卖出的最大收益
return sell2
本题可以用动态规划的思路进行解答,记录每个状态下的最大利润。本题思路比较巧妙,需要不少思维,同时也需要掌握动态规划的基础概念。