leetcode——Best Time to Buy and Sell Stock III
思路:将两段最大的利润相加,一段的最大利润不一定只在一个上升期内,例如在绿线间就有两个上升区间
只要算出i之前的最大利润和i之后的最大利润相加就行,因为i不可能同时是峰值或者谷值,所以能保证不是在同一天买进和卖出
绿线的利润加上红线利润是最大利润。
class Solution {
// 算出利润最大的两段
// 算出i之前最大的利润和i之后最大的利润
// l[]: i之前最大的利润
// r[]: i之后最大的利润
// minVal: i之前最小值
// maxVal: i之后最大值
public:
int maxProfit(vector<int> &prices) {
if(prices.empty()) return 0;
const int size = prices.size();
int l[size], r[size], minVal(prices[0]), maxVal(prices[size-1]);
// 算出i之前的最大利润
l[0] = 0;
for(int i = 1; i < size; i ++){
l[i] = max(l[i-1], prices[i] - minVal);
minVal = min(prices[i], minVal);
}
// 算出i之后的最大利润
r[size-1] = 0;
for(int i = size-2; i >= 0; i --){
r[i] = max(r[i+1], maxVal - prices[i]);
maxVal = max(maxVal, prices[i]);
}
// 算出总的最大利润
int profit(0);
for(int i = 0; i < size; i ++){
profit = max(profit, l[i] + r[i]);
}
return profit;
}
};


浙公网安备 33010602011771号