以每一个i, 计算出从 0 ~ i, i +1 ~ size 两段的最大收益。 再找出两者和最大的就可以了。
class Solution {
public:
int maxProfit(vector<int> &prices) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(prices.size() < 2) return 0;
vector<int>left_max(prices.size()), right_max(prices.size());
left_max[0] = 0;
int curmin = prices[0], ans = 0;
for(int i = 1; i < prices.size(); ++ i)
{
if(ans < prices[i] - curmin)
{
ans = prices[i] - curmin;
}
left_max[i] = ans;
if(prices[i] < curmin)
curmin = prices[i];
}
right_max[prices.size()-1] = 0;
ans = 0;
int result = 0;
int curmax = prices[prices.size()-1];
for(int i = prices.size()-2; i >= 0; i --)
{
if(ans < curmax - prices[i])
ans = curmax - prices[i];
right_max[i] = ans;
if(prices[i] > curmax)
curmax = prices[i];
if(i > 0 && left_max[i-1]+right_max[i] > result)
result = left_max[i-1]+right_max[i];
}
if(result < right_max[0])
result = right_max[0];
return result;
}
};