1、分别计算出0天到i天的最大利润和i天到最后一天的最大利润,两者相加,找出最大的,但是超时了。
class Solution {
public:
int maxProfit(vector<int>& prices)
{
const int size=prices.size();
if(size==0)
return 0;
vector<int> trade1(size,0);
vector<int> trade2(size,0);
int maxPro=0;
for(int i=1;i<size;++i)
{
int curMin1=prices[0];
int result1=0;
for(int j=1;j<=i;++j)
{
if(prices[j]<curMin1)
curMin1=prices[j];
else
result1=max(result1,prices[j]-curMin1);
}
trade1[i]=result1;
}
for(int i=0;i<size;++i)
{
int curMin2=prices[i];
int result2=0;
for(int j=i+1;j<size;++j)
{
if(prices[j]<curMin2)
curMin2=prices[j];
else
result2=max(result2,prices[j]-curMin2);
}
trade2[i]=result2;
}
for(int m=0;m<size;++m)
maxPro=max(maxPro,trade1[m]+trade2[m]);
return maxPro;
}
};
2、修改了一下。第0天到第i天的最大利润等于第0天到第i-1天的最大利润和在第i天交易的利润两者中的最大值。同理,第i天到最后一天的最大利润等于第i+1天到最后一天的最大利润和在第i天买入得到的利润两者中的最大值。这样就可以了。
class Solution {
public:
int maxProfit(vector<int>& prices)
{
const int size=prices.size();
if(size==0)
return 0;
vector<int> trade1(size,0);
vector<int> trade2(size,0);
int curMin=prices[0];
int curMax=prices[size-1];
int result=0;
for(int i=1;i<size;++i)
{
curMin=min(curMin,prices[i]);
trade1[i]=max(trade1[i-1],prices[i]-curMin);
}
for(int j=size-2;j>=0;--j)
{
curMax=max(curMax,prices[j]);
trade2[j]=max(trade2[j+1],curMax-prices[j]);
}
for(int i=0;i<size;++i)
{
result=max(result,trade1[i]+trade2[i]);
}
return result;
}
}