class Solution {
public:
int maxProfit(vector<int> &prices) {
int n=prices.size();
if(n==0) return 0;
//从左到右遍历计算maxProfit(prices[0:i])
int *minVal=new int[n];//minVal[i] -> [0:i]区间的最小值
int minBase=INT_MAX;
for(int i=0;i<n;i++)
{
if(prices[i]<minBase)
{
minVal[i]=prices[i];
minBase=prices[i];
}
else
{
minVal[i]=minBase;
}
}
int *profitLeft=new int[n];//profitLeft[i]->maxProfit(prices[0:i])
profitLeft[0]=0;
int left_base=0;
for(int i=1;i<n;i++)
{
if(prices[i]-minVal[i-1] > left_base)
{
profitLeft[i]=prices[i]-minVal[i-1];
left_base=prices[i]-minVal[i-1];
}
else
{
profitLeft[i]=left_base;
}
}
//从右到左遍历计算maxProfit(prices[i:n-1])
int *maxVal=new int[n];//maxVal[i] -> [i:n-1]区间的最大值
int maxBase=INT_MIN;
for(int i=n-1;i>=0;i--)
{
if(prices[i]>maxBase)
{
maxVal[i]=prices[i];
maxBase=prices[i];
}
else
{
maxVal[i]=maxBase;
}
}
int *profitRight=new int[n];//profitRight[i]->maxProfit(prices[i:n-1])
profitRight[n-1]=0;
int right_base=0;
for(int i=n-2;i>=0;i--)
{
if(maxVal[i+1]-prices[i] > right_base)
{
profitRight[i]=maxVal[i+1]-prices[i];
right_base=maxVal[i+1]-prices[i];
}
else
{
profitRight[i]=right_base;
}
}
//求max{prices[0:i]+prices[i,n-1]} i>=0 && i<=n-1
int ret=INT_MIN;
for(int i=0;i<n;i++)
{
ret=max(profitLeft[i]+profitRight[i],ret);
}
return ret;
}
};
Best Time to Buy and Sell Stock III
最新推荐文章于 2022-04-26 10:52:27 发布