1、题目
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/
2、题意
题解1:线性扫描(On)
维护f[i]数组表示购买一次所能组成的最大值;
res初始化为f[n-1](表示只买一次的最大值);
从后往前遍历 维护一个从后往前的最大值maxv 当当前数值<maxv更新res = res = max(res,maxv-prices[i]+f[i-1]);(表示只买卖一次且是第天买入的最大值);
/* */
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<int> f(n,0);
for(int i=0,minv = INT_MAX;i<n;i++)
{
if(i)
f[i] = max(f[i-1],prices[i]-minv);
minv = min(prices[i],minv);
}
int res = f[n-1];
for(int i=n-1,maxv = INT_MIN;i>0;i--)
{
if(prices[i]<maxv)
res = max(res,maxv-prices[i]+f[i-1]);
maxv = max(maxv,prices[i]);
}
return res;
}
};