题目:
只能买卖两次,而且最大手里只有一只股票。求最大利润。
解答:
参考:
http://www.cnblogs.com/lihaozy/archive/2012/12/19/2825525.html
http://haoplusplus.com/2014/02/18/leetcode-best-time-to-buy-and-sell-stock-i-ii-and-iii/
代码:
/*
解释:
首先,因为能买2次(第一次的卖可以和第二次的买在同一时间),但第二次的买不能在第一次的卖左边。
所以维护2个表,f1和f2,size都和prices一样大。
意义:
f1[i]表示 -- 截止到i下标为止,左边所做交易能够达到最大profit;
f2[i]表示 -- 截止到i下标为止,右边所做交易能够达到最大profit;
那么,对于f1 + f2,寻求最大即可。
*/
class Solution {
public:
int maxProfit(vector<int> &prices) {
int size = prices.size();
if (size == 0)
return 0;
vector<int> f1(size);
vector<int> f2(size);
int minV = prices[0];
f1[0] = 0;
for (int i = 1; i < size; i++)
{
minV = min(minV, prices[i]);
f1[i] = max(f1[i - 1], prices[i] - minV);
}
int maxV = prices[size - 1];
f2[size - 1] = 0;
for (int i = size - 2; i >= 0; i--)
{
maxV = max(maxV, prices[i]);
f2[i] = max(f2[i + 1], maxV - prices[i]);
}
int sum = 0;
for (int i = 0; i < size; i++)
{
sum = max(sum, f1[i] + f2[i]);
}
return sum;
}
};