• leetcode Best Time to Buy and Sell Stock III


    思路:

    知道要用DP做,但是一开始思路是错的。后来参考了 http://blog.csdn.net/pickless/article/details/12034365

    才意识到可以在整个区间的每一点切开,然后分别计算左子区间和右子区间的最大值,然后再用O(n)时间找到整个区间的最大值。

    看来以后碰到与2相关的问题,一定要想想能不能用二分法来做!

    下面复制pickless的讲解,我觉得我不能比他讲的更好了

     参考:

    http://blog.csdn.net/pickless/article/details/12034365

    http://blog.csdn.net/fightforyourdream/article/details/14503469

    O(n^2)的算法很容易想到:

    找寻一个点j,将原来的price[0..n-1]分割为price[0..j]和price[j..n-1],分别求两段的最大profit。

    进行优化:

    对于点j+1,求price[0..j+1]的最大profit时,很多工作是重复的,在求price[0..j]的最大profit中已经做过了。

    类似于Best Time to Buy and Sell Stock,可以在O(1)的时间从price[0..j]推出price[0..j+1]的最大profit。

    但是如何从price[j..n-1]推出price[j+1..n-1]?反过来思考,我们可以用O(1)的时间由price[j+1..n-1]推出price[j..n-1]。

    最终算法:

    数组l[i]记录了price[0..i]的最大profit,

    数组r[i]记录了price[i..n]的最大profit。

    已知l[i],求l[i+1]是简单的,同样已知r[i],求r[i-1]也很容易。

    最后,我们再用O(n)的时间找出最大的l[i]+r[i],即为题目所求。

    public static int maxProfit(int[] prices) {
            if(prices==null||prices.length==0){
                return 0;
            }
            int n=prices.length;
            int[] left=new int[n];
            int[] right=new int[n];
            int min=prices[0];
            for(int i=1;i<n;i++){
                left[i]=left[i-1]>prices[i]-min?left[i-1]:prices[i]-min;
                min=min<prices[i]?min:prices[i];
            }
            int max=prices[n-1];
            for(int i=n-2;i>=0;i--){
                right[i]=right[i+1]>max-prices[i]?right[i+1]:max-prices[i];
                max=max>prices[i]?max:prices[i];
            }
            int value=0;
            for(int i=0;i<n;i++){
                value=value>left[i]+right[i]?value:left[i]+right[i];
            }
            return value;
        }

    测试用例:

    1 4 2 7 3 9

    0 3 3 6 6 8

    8 7 7 6 6 0

    profits:12

  • 相关阅读:
    WebDev.WebServer使用帮助
    [原创]通过编写PowerDesigner脚本功能批量修改属性
    Web中响应用户修改的事件
    郁闷的切换foxmail
    Java中Split函数的用法技巧
    [转].NET安装项目卸载的方法
    把你的名字刻到IE上
    JavaScript面向对象编程笔记
    附件下载直接显示另存为对话框并保存原有中文文件名的解决办法
    MyEclipse开发JSP页面假死问题解决办法
  • 原文地址:https://www.cnblogs.com/csxf/p/3735312.html
Copyright © 2020-2023  润新知