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.
分析:和题1的只能购买一次,和题2购买不限次数,题3购买2次显得要复杂.可以在题1的基础上,将数组分为2段分别求解最大利润,那么需要的时间复杂度其实也为O(N),因为maxProfit(0,i)可以根据maxProfit(0,i+1)在O(1)内算出,maxProfit(i,N)也可以根据maxProfit(i+1,N)在O(1)内算出
class Solution {
public:
int maxProfit(vector<int> &prices) {
int n = prices.size();
if(n < 2)return 0;
vector<int> maxLs(n,0);
vector<int> maxRs(n,0);
int ret = 0;
int Lmin = prices[0]; //[0,i]范围内最小值
int Lgap = 0;
int Rmax = prices[n-1];//[i,n-1]范围内最大值
int Rgap = 0;
for(int i = 0; i < n; i++)
{
if(Lgap < prices[i]-Lmin) Lgap = prices[i]-Lmin;
if(Lmin > prices[i]) Lmin = prices[i];
maxLs[i] = Lgap;
if(Rgap < Rmax - prices[n-1-i]) Rgap = Rmax - prices[n-1-i];
if(Rmax < prices[n-1-i])Rmax = prices[n-1-i];
maxRs[n-1-i] = Rgap;
}
for(int i = 0; i < n; i++)
{
if(ret < maxLs[i] + maxRs[i]) ret = maxLs[i] + maxRs[i];
}
return ret;
}
};