Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most two transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
需要注意的是,可以操作两次买卖,但是第二次买入必须在第一次卖出之后才能操作。所以思路就是先正序使用贪心计算每一天之前买入卖出可能达到的最大收益,拿数组记录下来。再逆序计算每一天对应的之后买入卖出可能达到的最大收益,拿数组记录下来。然后将两个数组中每一天对应的两种情况可以实现的收益之和,得到最大值即为可以实现的最大收益。code如下:
class Solution {
public:
int maxProfit(vector<int> &prices) {
if(prices.empty())
return 0;
int n = prices.size();
vector<int> pre(n,0);
vector<int> post(n,0);
int curMin = prices[0];
int curMax = prices[n-1];
int result=0;
for(int i=1; i<n; i++)
{
curMin = curMin<prices[i] ? curMin : prices[i];
int diff = prices[i]-curMin;
pre[i] = pre[i-1]>diff ? pre[i-1] : diff;
}
for(int i=n-2; i>=0; i--)
{
curMax = curMax>prices[i] ? curMax : prices[i];
int diff = curMax-prices[i];
post[i] = post[i+1]>diff ? post[i+1] : diff;
}
for(int i=1; i<n; i++)
{
result = result>(pre[i]+post[i]) ? result : (pre[i]+post[i]);
}
return result;
}
};