1.基本思路:
此题可通过DP来解决,但状态转移方程的构想不是那么明显,首先可以通过两个数组来表示买与卖的信息:
- buy[i]:表示第i天为止,最近一次股票购入后所持有的利润
- sell[i]:表示第i天为止,最近一次股票抛售后所持有的利润
其中:最近一次表示在第i天或者之前所做的股票交易。
2.状态转移方程
buy[i] = max(buy[i-1],sell[i-2]-prices[i]); //越大,说明现有的利润越大,购入所付出的少
- buy[i-1]:表示第i天之前最近一次股票购入后所持有的利润
- sell[i-2]-prices[i]:考虑是否可以用更便宜的购入替换之前的购入,由于有cooldown的限定,所以要以之前两天抛售点为基础进行购入
sell[i] = max(sell[i-1],buy[i-1]+prices[i]); //越大,说明抛售后的利润越大
- sell[i-1]:表示第i天之前最近一次股票抛售后所持有的利润
- buy[i-1]+prices[i]:考虑是否可以用更大的利润抛售股票
3.实现
由于在状态转移方程中所使用的buy,sell数组元素有限,所以可以同变量的形式替换,以达到o(1)的空间复杂度,o(n)的时间复杂度
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.size()<2) return 0; //一次交易都无法进行
int b,b1=INT_MIN;
int s=0,s1=0,s2=0;
for (int i=0;i<prices.size();++i) //通过状态转移方程计算
{
b = max(b1,s2-prices[i]);
s = max(s1,b1+prices[i]);
b1=b,s2=s1,s1=s;
}
return s; //返回最终一次股票抛售后所持有的利润
}
};