动态规划
求两次买卖股票的最佳时机。不能没卖就买。而且是最多买卖两次,也就是说我们可以买卖一次。但是要保证收益是最大的。
状态表示:f[i]表示[0,i]天内买卖一次的最大收益值。g[i]表示[i, n - 1]天内买卖一次的最大收益值。
状态方程: res = max(res , f[i] + g[i]);
对于两次的买卖,我们可以枚举第二次买的时候。
我们用f[i]表示前i天买卖一次的收益最大值,用g[i]表示第i天后买卖一次的收益最大值,最后枚举每天,前面买卖一次和后面买卖一次和的最大值即可。
$ 时间复杂度O(N),空间复杂度O(N) $
参考文献
lc究极班
AC代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
//特判
int n = prices.size();
if (!n) return 0;
vector<int> f(n, 0);
vector<int> g(n, 0);
//求[0,i]天内买卖一次的最大收益值
for (int i = 1, low = prices[0]; i < n ; i++){
f[i] = max(f[i - 1], prices[i] - low);
low = min(low, prices[i]);
}
//求[i, n - 1]天内买卖一次的最大收益值
for (int i = n - 2, high = prices[n - 1]; i >= 0 ; i -- ){
g[i] = max(g[i + 1], high - prices[i]);
high = max(high, prices[i]);
}
//枚举i
int res = 0;
for (int i = 0 ; i < n ; i ++){
res = max(res, f[i] + g[i]);
}
return res;
}
};
注意:如果用状态机的话,vector会被卡掉