LeetCode 123. Best Time to Buy and Sell Stock III
题目:
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).
分析:
方法很暴力,没有用分治,耗时很长。仅为提供另外一种思路。
这里构建了上图的模型,很显然,我们要使money[0]+money[1]最大化,当loss_now朝向向下时,loss_now归入loss[1],朝向向上时,我们要想取得最大化利润得考虑以下几个操作:
无操作
money[1]代替loss_now
money[0]代替money[1],money[1]代替loss_now
money[0]与money[1]合并,money[1]代替loss_now
money_[1]与loss_now合并
至于采用哪个操作就看哪个操作带来的利润更大。
具体代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (!prices.size())return 0;
vector<int> money(2, 0);
vector<int> loss(2, 0);
int loss_last = 0;
for (int index = 1; index < prices.size(); index++)
{
int loss_now = prices[index] - prices[index - 1] + loss_last;
if (loss_now < 0)
{
loss_last = 0;
if (money[1] != 0)loss[1] -= loss_now;
else if (money[0] != 0)loss[0] -= loss_now;
}
else if (loss_now > 0)
{
if (money[1] != 0)
{
int max_value = max((money[0]+money[1]),(money[1]+loss_now));
max_value = max(max_value, (money[0] + loss_now));
max_value = max(max_value, (money[0] + money[1] + loss_now - loss[0]));
max_value = max(max_value, (money[0] + money[1] + loss_now - loss[1]));
cout<<max_value<<endl;
if (max_value == (money[0] + money[1]))
{
loss_last = loss_now;
cout<<"!"<<loss_last<<endl;
continue;
}
else if (max_value == (money[0] + loss_now))
{
loss[0] = loss[0] - money[1] + loss[1];
loss[1] = 0;
money[1] = loss_now;
}
else if (max_value == (money[1] + loss_now))
{
loss[0] = loss[1];
loss[1] = 0;
money[0] = money[1];
money[1] = loss_now;
}
else if (max_value == (money[0] + money[1] + loss_now - loss[0]))
{
money[0] = money[0] - loss[0] + money[1];
money[1] = loss_now;
loss[0] = loss[1];
loss[1] = 0;
}
else if (max_value == (money[0] + money[1] + loss_now - loss[1]))
{
money[1] = money[1] - loss[1] + loss_now;
loss[1] = 0;
}
loss_last = 0;
}
else if(money[0] != 0)
money[1] = loss_now;
else
money[0] = loss_now;
}
}
return money[0] + money[1];
}
};
- -