Leetcode 买卖股票

题目描述

假设你有一个数组,其中第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

 

  1. 假设你现在手里的钱数为0。
  2. buy1,记录的是在从第1天到第i天你能买到的最低价格(买了,所以欠账,所以记录为负数,所以用max),
  3. sell1,记录的是在第1天到第i天中的某天,你卖出,能最多赚到多少钱。
  4. buy2和sell2有一个前提条件是你在第i天前,是否进行了第一次交易,如果进行了,那么用第一次交易的利润,在往下计算,这样你是带着第一次交易的利润,来计算的,所以接下来,如果你又进行了交易,那么就是2次交易的最大值。
  5. 如果你在第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;
        
    }

 

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页