class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> maxProfits(prices.size(),vector<int>(2,0));
int maxPos = prices.size() - 1;
if(maxPos <= 0 ) return 0;
maxProfits[0][0] = 0;
maxProfits[0][1] = prices[0];//top
maxProfits[0][2] = prices[0];//bottom
for(int i=1;i<=maxPos;i++){
//maxProfits[i][0] = max(maxProfits[i-1][0],max(maxProfits[i-1][1]-prices[i],prices[i] - maxProfits[i-1][2]));
maxProfits[i][0] = max(maxProfits[i-1][0],prices[i] - maxProfits[i-1][2]);
maxProfits[i][2] = prices[i]<maxProfits[i-1][2] ? prices[i] : maxProfits[i-1][2];
}
vector<vector<int>> maxProfits1(prices.size(),vector<int>(2,0));
if(maxPos <= 0 ) return 0;
maxProfits1[maxPos][0] = 0;
maxProfits1[maxPos][1] = prices[maxPos];//top
maxProfits1[maxPos][2] = prices[maxPos];//bottom
for(int i=maxPos-1;i>=0;i--){
maxProfits1[i][0] = max(maxProfits1[i+1][0],maxProfits1[i+1][1] - prices[i]);
maxProfits1[i][1] = prices[i]>maxProfits1[i+1][1] ? prices[i] : maxProfits1[i+1][1];
}
int total = maxProfits1[0][0];//执行一次操作
for(int i=2;i<=maxPos-1;i++){
total = max(total,maxProfits[i-1][0] + maxProfits1[i][0] );
}
return total;
}
};
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> maxProfits(prices.size(),vector<int>(2,0));
int maxPos = prices.size() - 1;
if(maxPos <= 0 ) return 0;
maxProfits[0][0] = 0;
maxProfits[0][1] = prices[0];//top
maxProfits[0][2] = prices[0];//bottom
for(int i=1;i<=maxPos;i++){
//maxProfits[i][0] = max(maxProfits[i-1][0],max(maxProfits[i-1][1]-prices[i],prices[i] - maxProfits[i-1][2]));
maxProfits[i][0] = max(maxProfits[i-1][0],prices[i] - maxProfits[i-1][2]);
maxProfits[i][2] = prices[i]<maxProfits[i-1][2] ? prices[i] : maxProfits[i-1][2];
}
vector<vector<int>> maxProfits1(prices.size(),vector<int>(2,0));
if(maxPos <= 0 ) return 0;
maxProfits1[maxPos][0] = 0;
maxProfits1[maxPos][1] = prices[maxPos];//top
maxProfits1[maxPos][2] = prices[maxPos];//bottom
for(int i=maxPos-1;i>=0;i--){
maxProfits1[i][0] = max(maxProfits1[i+1][0],maxProfits1[i+1][1] - prices[i]);
maxProfits1[i][1] = prices[i]>maxProfits1[i+1][1] ? prices[i] : maxProfits1[i+1][1];
}
int total = maxProfits1[0][0];//执行一次操作
for(int i=2;i<=maxPos-1;i++){
total = max(total,maxProfits[i-1][0] + maxProfits1[i][0] );
}
return total;
}
};
本文介绍了一种算法,用于计算给定一系列股票价格时的最大可能利润。该算法通过两次遍历股票价格数组实现:第一次从前向后寻找买入时机,第二次从后向前确定卖出时机。最终得出在允许买卖一次或多次的情况下,获取最大利润的方法。
551

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



