题目描述
假设你有一个数组,其中第i个元素是某只股票在第i天的价格。
设计一个算法来求最大的利润。你最多可以进行两次交易。
注意:
你不能同时进行多个交易(即,你必须在再次购买之前出售之前买的股票)。
示例1
输入
复制
[1,4,2]
输出
复制
3
思路1:由于股票买入卖出不能交叉,所以必定分为前后两部分购买即两段
pre[i]表示从第0天到第i天 股票可以获得的最大差值利润
post[i]表示从第i天到最后一天 股票可以获得的最大差值利润(可反向计算)
int maxProfit(vector<int>& prices) {
if(prices.size()==0)
return 0;
int pre[100000];
int post[100000];
for(int i=0;i<100000;i++)
{
pre[i]=post[i]=0;
}
int min=prices[0];
for(int i=1;i<prices.size();i++)
{
pre[i]=max(pre[i-1],prices[i]-min);//更新pre
if(prices[i]<min)
min=prices[i];//更新最小点
}
int max_=prices[prices.size()-1];
for(int i=prices.size()-2;i>=0;i--)
{
post[i]=max(post[i+1],max_-prices[i]);
if(prices[i]>max_)
max_=prices[i];//更新最大点
}
int res=0;
for(int i=0;i<prices.size();i++)
{
if(pre[i]+post[i]>res)
res=pre[i]+post[i];
}
return res;
}
思路2:采取四个变量记录买入卖出 buy1 sell1 buy2 sell2
- 假设你现在手里的钱数为0。
- buy1,记录的是在从第1天到第i天你能买到的最低价格(买了,所以欠账,所以记录为负数,所以用max),
- sell1,记录的是在第1天到第i天中的某天,你卖出,能最多赚到多少钱。
- buy2和sell2有一个前提条件是你在第i天前,是否进行了第一次交易,如果进行了,那么用第一次交易的利润,在往下计算,这样你是带着第一次交易的利润,来计算的,所以接下来,如果你又进行了交易,那么就是2次交易的最大值。
- 如果你在第i天前,没有进行交易,那么buy1和buy2其实是一样的,sell1和sell2是一样的,都没有变化。
int maxProfit(vector<int>& prices) {
// write code here
if(prices.size()==0)
return 0;
//两次的顺序一定为 buy1->sell1->buy2->sell2
int buy1=-10000;
int buy2=-10000;
int sell1=0;
int sell2=0;
//buy1->sell1 ->buy2 ->sell2 .我们求每一个变量就假设其前方的数据已经固定
for(int i=0;i<prices.size();i++)
{
buy1=max(buy1,-prices[i]);//买入需要为扣钱 故为-
sell1=max(sell1,buy1+prices[i]);//卖出获得利润
buy2=max(buy2,sell1-prices[i]);
sell2=max(sell2,buy2+prices[i]);
}
*/
return sell2;
}