zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Zabbix5 Frame 嵌套
    Zabbix5 对接 SAML 协议 SSO
    CentOS7 安装 Nexus
    CentOS7 安装 SonarQube
    GitLab 后台修改用户密码
    GitLab 查看版本号
    GitLab Admin Area 500 Error
    Linux 安装 PostgreSQL
    Liger ui grid 参数
    vue.js 是一个怪东西
  • 原文地址:https://www.cnblogs.com/csxf/p/3735312.html
Copyright © 2011-2022 走看看