123. 买卖股票的最佳时机 III
一、题目
给定一个数组,它的第 i
个元素是一支给定的股票在第 i
天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例1:
1 | 输入:prices = [3,3,5,0,0,3,1,4] |
示例2:
1 | 输入:prices = [1,2,3,4,5] |
示例 3:
1 | 输入:prices = [7,6,4,3,1] |
示例 4:
1 | 输入:prices = [1] |
提示:
1 ≤ prices.length ≤ 105
0 ≤ prices[i] ≤ 105
二、题解
动态规划
题解:
在任意一天结束后,我们会处于五种状态中的一种:
- 未进行任何操作
- 只进行了一次买操作
- 只进行一次买操作和一次卖操作,即完成了一笔交易
- 在完成了一笔交易的前提下,进行了第二次买操作
- 完成了两笔交易
由于第一个状态的利润显然为 0,因此我们可以不用将其记录。对于剩下的四个状态,我们分别将它们的最大利润记为 $buy_1$, $sell_1$, $buy_2$, $sell_2$
状态转移,知道第 i-1
天结束后的这四个状态,第 i
天的状态:
- 对于 $buy_1$
在第 i
天可以不进行任何操作,保持不变,也可以在未进行任何操作的前提下以 prices[i]
的价格买入股票,转移方程为:
其中,$buy_1(i)$ 表示 i
天的状态,$buy_1(i-1)$ 表示 i-1
天的状态,下面也是类似。
- 对于 $sell_1$
在第 i
天我们可以不进行任何操作,保持不变,也可以在只进行过一次买操作的前提下以 prices[i]
的价格卖出股票,转移方程为:
- 对于 $buy_2$
同理转移方程为:
- 对于 $sell_2$
同理转移方程为:
理论上,我们需要维护四个数组 $buy_1[i]$ , $sell_1[i]$ , $buy_2[i]$ , $sell_2[i]$ ,但是因为每个状态只与前一天的状态有关,因而我们可以进一步降低空间复杂度,我们只需维护四个变量:$buy_1$ , $sell_1$ , $buy_2$ , $sell_2$,然后不断的更新这四个变量即可。
- 总的状态转移方程为:
- 时间复杂度:O($n$),其中 n 是数组 prices 的长度。
- 空间复杂度:O(1)。
1 | var maxProfit = function (prices) { |