题目大意:
Say you have an array for which the ith element is the price of a given stock on dayi.
Design an algorithm to find the maximum profit. You may complete at most two transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
意思就是:
给定一个整型数组,最多交易两次,求得最大利润。
思路:
设索引i,将数组一分为二,前半段为第一次最大利润,后半段为第二次最大利润。当然,有极端情况——即只交易一次,这种情况可以被两次的交易中包含,当i=0或i=length-1时。前半段的计算方法同Best Time to Buy and Sell Stock II的算法一样,即为profit_left[i] = (prices[i] - min > profit_left[i-1]?prices[i] - min:profit_left[i-1]);后半段的计算方法也类似,即为profit_right[j] = (max - prices[j] > profit_right[j+1]?max-prices[j]:profit_right[j+1]);。
代码如下:
class Solution {
public:
int maxProfit(vector<int> &prices){
vector<int>::size_type length = prices.size();
if(length == 0){
return 0;
}
int i, j, profit = 0;
int min = prices[0], max = prices[length - 1];
vector<int> profit_l,profit_r;
profit_l.resize(length);
profit_r.resize(length);
for(i=1;i<length;i++){
profit_l[i] = (prices[i] - min > profit_l[i-1]?prices[i] - min:profit_l[i-1]);
min = (prices[i]>min?min:prices[i]);
}
for(j=length-2;j>=0;j--){
profit_r[j] = (max - prices[j] > profit_r[j+1]?max-prices[j]:profit_r[j+1]);
max = (prices[j]>max?prices[j]:max);
}
for(i=0;i<length;i++){
profit = (profit_l[i]+profit_r[i]>profit?profit_l[i]+profit_r[i]:profit);
}
return profit;
}
};