/*由于最多存在两次交易,所以可以将数组分成两个子段,两个子段中分别做一次交易,
使得两侧交易之和最大即可。当在同一天进行了买入和卖出时,相当于不做交易,即整个
流程中只进行一次交易。用f[i]表示[0,i]中最大的值,g[i]表示[i,n-1]中交易最大的值。
那么结果即为max{f[i]+g[i]};
参考自:https://github.com/soulmachine/leetcode*/
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() < 2) return 0;
vector<int> f(prices.size(), 0);
vector<int> g(prices.size(), 0);
int low(prices[0]);
for(int i = 1; i < prices.size(); ++i){
low = min(low, prices[i]);
f[i] = max(f[i-1], prices[i] - low);
}
int high(prices[prices.size()-1]);
for(int i = prices.size()-2; i >= 0; --i){
high = max(high, prices[i]);
g[i] = max(g[i+1], high - prices[i]);
}
int res(0);
for(int i = 0; i < prices.size(); ++i){
res = max(f[i]+g[i], res);
}
return res;
}
};
LeetCode之Best Time to Buy and Sell Stock III
最新推荐文章于 2019-06-29 22:33:34 发布