思路:因为可以进行两次交易,而且每次交易不一定是在同一个单调区间内(不同于多次交易,如II )。
假设选择交易的分界点是 i 点(注意i点可以同时卖出、买进一次),只要知道i点左端的最大利率和右段的交易一次的最大利率,然后相加就是整个区间进行两次交易的最大利率,求解左右端利率的方法就是很基本的DP求解过程。
code:
class Solution {
public:
int maxProfit(vector<int> &prices) {
int len = prices.size();
if(len == 0)return 0;
int leftProfit[len], rightProfit[len];
memset(leftProfit,0,sizeof(int) * len);
memset(rightProfit,0,sizeof(int) * len);
int min_v = prices[0];
for(int i = 1;i <len;i++){
if(prices[i] < min_v)
min_v = prices[i];
leftProfit[i] = leftProfit[i-1] > (prices[i] - min_v) ? leftProfit[i-1] : (prices[i] - min_v);
}
int max_v = prices[len-1];
for(int i = len-2;i >= 0;i--){
if(prices[i] > max_v)
max_v = prices[i];
rightProfit[i] = rightProfit[i+1] > (max_v - prices[i]) ? rightProfit[i+1] : (max_v - prices[i]);
}
int maxProfit = 0;
for(int i = 0;i < len;i++)
maxProfit = std::max(maxProfit,rightProfit[i] + leftProfit[i]);
return maxProfit;
}
};