Say you have an array for which the ith element is the price of a given stock on day i.
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).
两次dp应该就够了,维护一个最小价格和一个最大价格, 一个从前往后找作为第一次交易,一个从后往前作为第二次的交易。 维护两个数组作为第一次交易最大和第二次交易最大, 所存的数分别为[0,i]和[i, len-1]最大的利润。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
if (prices.size()<=1)
return 0;
int minP=prices[0];
int maxP=prices[n-1];
vector<int> firstHand(n,0);
vector<int> secondHand(n, 0);
for (int i=1; i<n; i++){
minP=min(minP, prices[i]);
firstHand[i]=max(prices[i]-minP, firstHand[i-1]);
}
for (int j=n-2; j>=0; j--){
maxP=max(maxP, prices[j]);
secondHand[j]=max(maxP-prices[j], secondHand[j+1]);
}
int res=0;
for (int k=0; k<n; k++){
res=max(res, firstHand[k]+secondHand[k]);
}
return res;
}
};
本文介绍了一种算法,用于计算给定股票价格数组中通过最多两次买卖所能获得的最大利润。该算法采用双动态规划方法,分别从前向后和从后向前遍历价格数据,确保了在任何时候只进行一次交易。
538

被折叠的 条评论
为什么被折叠?



