1.题目描述

Say you have an array for which the ith element is the price of a given stock on day i.

 

Design an algorithm to find the maximum profit. You may complete at most two transactions.

 

Note:

You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

2.解法分析

限定了交易次数之后题目就需要我们略微思考一下了,由于有两次交易的机会,那么我们选定一个时间点ti,将此时间点作为两次交易的支点的话,必然有:

      t0….ti之内满足最佳交易原则,ti-tn天也满足最佳交易原则,那么这就是一个动态规划的策略了,于是有下面的代码:

 

class Solution {

public:

    int maxProfit(vector<int> &prices) {

        // Start typing your C/C++ solution below

        // DO NOT write int main() function

        if(prices.size() <=1)return 0;

        vector<int>::iterator iter;

 

    

        for(iter=prices.begin();iter!=prices.end()-1;++iter)

        {

            *iter = *(iter+1) - *iter;

        }

        

        prices.pop_back();

        

        vector<int>accum_forward;

        vector<int>accum_backward;

        

        int max = 0;

        int subMax = 0;

        

        for(iter=prices.begin();iter!=prices.end();++iter)

        {

            subMax += *iter;

            if(subMax > max)max=subMax;

            else

                if(subMax<0)subMax = 0;

                

            accum_forward.push_back(max);

        }

        

        vector<int>::reverse_iterator riter;

        

        max =0 ;

        subMax = 0;

        for(riter=prices.rbegin();riter!=prices.rend();++riter)

        {

            subMax +=*riter;

            if(subMax >max)max = subMax;

            else

                if(subMax<0)subMax=0;

                

            accum_backward.push_back(max);

        }

    

        max =0;

        int len = accum_forward.size();

        for(int i=0;i<len-1;++i)

        {

            if((accum_forward[i]+accum_backward[len-i-2])>max)    

                max = accum_forward[i]+accum_backward[len-i-2];

        }

        

        return max>accum_forward[len-1]?max:accum_forward[len-1];

        

    }

};

 

ps:做完题之后提交,发现老是AC不了,有个case总是解决不了,本来以为是自己代码写得有问题,检查了半天没发现错误,于是开始看别人怎么写,结果发现别人AC的代码也过不了,猜想可能系统还是做得不完善,应该是后台的线程相互干扰了,过了一段时间果然同样的代码又可以AC了。在这段过程中,看别人写的代码,发现了一个比我简洁一些的写法,虽然我么你的复杂度是一样的,但是此君代码量比我的小一点,以后学习学习,另外,一直不知道vector还可以预先分配大小,从这个代码里面也看到了,算是有所收获。附代码如下:

class Solution {

public:

    int maxProfit(vector<int> &prices) {

        // null check

        int len = prices.size();

        if (len==0) return 0;

 

        vector<int> historyProfit;

        vector<int> futureProfit;

        historyProfit.assign(len,0);

        futureProfit.assign(len,0);

        int valley = prices[0];

        int peak = prices[len-1];

        int maxProfit = 0;

 

        // forward, calculate max profit until this time

        for (int i = 0; i<len; ++i)

        {

            valley = min(valley,prices[i]);

            if(i>0)

            {

                historyProfit[i]=max(historyProfit[i-1],prices[i]-valley);

            }

        }

 

        // backward, calculate max profit from now, and the sum with history

        for (int i = len-1; i>=0; --i)

        {

            peak = max(peak, prices[i]);

            if (i<len-1)

            {

                futureProfit[i]=max(futureProfit[i+1],peak-prices[i]);

            }

            maxProfit = max(maxProfit,historyProfit[i]+futureProfit[i]);

        }

        return maxProfit;

    }

 

};

leetcode—Best Time to Buy and Sell stocks III的更多相关文章

  1. LeetCode: Best Time to Buy and Sell Stock III 解题报告

    Best Time to Buy and Sell Stock IIIQuestion SolutionSay you have an array for which the ith element ...

  2. [LeetCode] Best Time to Buy and Sell Stock III 买股票的最佳时间之三

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  3. [LeetCode] Best Time to Buy and Sell Stock III

    将Best Time to Buy and Sell Stock的如下思路用到此题目 思路1:第i天买入,能赚到的最大利润是多少呢?就是i + 1 ~ n天中最大的股价减去第i天的. 思路2:第i天买 ...

  4. LeetCode: Best Time to Buy and Sell Stock III [123]

    [称号] Say you have an array for which the ith element is the price of a given stock on day i. Design ...

  5. [Leetcode] Best time to buy and sell stock iii 买卖股票的最佳时机

    Say you have an array for which the i th element is the price of a given stock on day i. Design an a ...

  6. [leetcode]Best Time to Buy and Sell Stock III @ Python

    原题地址:https://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/ 题意: Say you have an array ...

  7. leetcode -- Best Time to Buy and Sell Stock III TODO

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  8. LeetCode——Best Time to Buy and Sell Stock III

    Description: Say you have an array for which the ith element is the price of a given stock on day i. ...

  9. LeetCode——Best Time to Buy and Sell Stock III (股票买卖时机问题3)

    问题: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...

随机推荐

  1. uva 10306

    有点不同的完全背包问题  但思路还是一样的 /************************************************************************* > ...

  2. Unity3d + NGUI 的多分辨率适配(黑边)

    原地址:http://www.2cto.com/kf/201310/250921.html 一.当下移动设备的主流分辨率(数据来自“腾讯分析移动设备屏幕分辨率分析报告”) 1.1 iOS设备的分辨率主 ...

  3. Python利用ConfigParser读取配置文件

    http://www.2cto.com/kf/201108/100384.html #!/usr/bin/python # -*- coding:utf-8 -*- import ConfigPars ...

  4. 学点PYTHON基础的东东--数据结构,算法,设计模式---访问者模式

    说实话,感觉不是特别多,可能没遇到过多场面, 所以对应用场景没感觉吧. 反正,各种模式就是把类的实例传来传去,久而久之,产生了一些规律...:) # 轮子,引擎, 车身这些定义好了都不需要变动 cla ...

  5. CKEditor在线编辑器增加一个自定义插件

    CKEditor是一个非常优秀的在线编辑器,它的前身就是FCKEditor,CKEditor据官方说是重写了内核的,但功能和性能比FCKEditor更为强大和优越.记得07年的时候第一次接触FCKEd ...

  6. BZOJ 3925 ZJOI2015 地震后的幻想乡

    假设我们用了边权前i小的边使得图连通,那么对答案的贡献为i/m+1 又因为期望的线性性质,我们只需要求用了i条边就可以了 不妨设g(S)(i)表示用了i条边使得点集S连通的概率 设f(S)(i)表示用 ...

  7. C++ eof()函数相关应用技巧分享

    C++编程语言中的很多功能在我们的实际应用中起着非常大的作用.比如在对文件文本的操作上,就可以用多种方式来实现.在这里我们介绍的C++ eof()函数就是其中一个比较常用的基本函数. 在使用C/C++ ...

  8. POJ1328——Radar Installation

    Radar Installation Description Assume the coasting is an infinite straight line. Land is in one side ...

  9. WINCE6.0+IMX515通过cfimager.exe烧录镜像文件

    WINCE6.0+IMX515通过cfimager.exe烧录镜像文件 freescale提供了cfimager.exe工具,可在SD/MMC卡中烧录系统镜像文件和创建FAT文件,这样,我们可以不需要 ...

  10. General Ledger Useful SQL Scripts – Oracle Applications 11i

    General Ledger Useful SQL Scripts – Oracle Applications 11i Contents GL Set of Books Configuration O ...