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).
class Solution {
private:
int maxOneProfit(vector<int> &prices, int start, int end)
{
if(end <= start)
return 0;
vector<int> min_price(end-start+1, prices[start]);
vector<int> max_price(end-start+1, prices[end]);
for(int i = start+1; i<= end; i++)
{
if(prices[i] <= min_price[i-start-1])
min_price[i-start] = prices[i];
else
min_price[i-start] = min_price[i-start-1];
}
for(int i = end-1; i >= start; i--)
{
if(prices[i] >= max_price[i-start+1])
max_price[i-start] = prices[i];
else
max_price[i-start] = max_price[i-start+1];
}
int max = 0;
for(int i = 0; i <= end-start; i++)
{
int t = max_price[i] - min_price[i];
if(t > max)
max = t;
}
return max;
}
public:
int maxProfit(vector<int> &prices) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(prices.empty())
return 0;
int num = prices.size();
if(num == 1)
return 0;
int max = 0;
for(int i = 1; i < num; i++)
{
if(prices[i] < prices[i-1])
{
int p = maxOneProfit(prices, 0, i-1);
int q = maxOneProfit(prices, i, num-1);
if(max < (p+q))
max = p+q;
}
}
int p = maxOneProfit(prices, 0, num-1);
if(p > max) max = p;
return max;
}
};