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. hdu 3449

    有依赖的背包,转化成01背包来做: #include<iostream> #include<cstdio> #include<cstring> #include&l ...

  2. 软考类----编码、ASII码等

    淘米2014实习生笔试,今年是淘米第一年招暑期实习生,笔试好大部分考的是软考的题目啊啊啊啊(劳资后悔当年没考软考刷加权),其他是浅而泛的风格,C++,SQL语句,数据结构(哈夫曼树,二叉查找树,栈后缀 ...

  3. Ubuntu环境下手动配置zookeeper

    配置zookeeper 注意:因为是单机伪分布式配置,故同一机器上有3个server zookeeper文件格式如下 home---zookeeper---server0---zookeeper | ...

  4. android 多个listView的向下滚动设置 listView动态设置高度代码

    墨迹天气图: 这里都是用的android里面的shape实现的,实现起来比较简单,只是在滚动的时候有点小麻烦... 当我们多个ListView超出了它的父控件LinearLayout的时候,它们每个L ...

  5. spring结合时,web.xml的配置

    <!-- 1. web.xml配置 <context-param> <param-name>webAppRootKey</param-name> <pa ...

  6. Centos之LAMP环境搭建

    原文:http://blog.sina.com.cn/s/blog_c02ed6590101d2sl.html 一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@ ...

  7. Servlet入门案例

    开发servlet有三种方法: 1.实现Servlet接口; public interface Servlet { void init(ServletConfig var1) throws Servl ...

  8. NAT负载均衡

    NAT(Network Address Translation 网络地址转换)简单地说就是将一个IP地址转换为另一个IP地址,一般用于未经注册的内部地址与合法的.已获注册的Internet IP地址间 ...

  9. 数据段、代码段、堆栈段、BSS段

    在linux中,进程在内存中一般会分为5个段,用来存放从磁盘载入的程序代码,等. 这五个段分别是: BSS段: 通常用来存放程序中未初始化的全局变量的一块内存区域.属于静态内存分配. 问题:全局变量不 ...

  10. JS复制对象

    CSSCommonJS.DeepCopy = function (json) { if (typeof json == 'number' || typeof json == 'string' || t ...