码迷,mamicode.com
首页 > 其他好文 > 详细

123. Best Time to Buy and Sell Stock III

时间:2016-05-22 06:08:33      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

    /*
     * 123. Best Time to Buy and Sell Stock III
     * 2016-5-21 by Mingyang
     * 根据题目要求,最多进行两次买卖股票,而且手中不能有2只股票,就是不能连续两次买入操作。
     * 所以,两次交易必须是分布在2各区间内,也就是动作为:买入卖出,买入卖出。
     * 进而,我们可以划分为2个区间[0,i]和[i,len-1],i可以取0~len-1。
     * 那么两次买卖的最大利润为:在两个区间的最大利益和的最大利润。
     * 一次划分的最大利益为:Profit[i] = MaxProfit(区间[0,i]) + MaxProfit(区间[i,len-1]);
     * 最终的最大利润为:MaxProfit(Profit[0], Profit[1], Profit[2], ... , Profit[len-1])。
     * 这道题目的思路一开始我想用Greedy,来找到最大的两个,但发现这个用greedy的话需要更新range
     * 后面想到了dp,left[i]表示从0到i这个range以后买卖一次的最高获利,其实就是跟I题差不多的问题
     * 最后再加起来结果
     */
      public int maxProfit1(int[] prices) {
          if(prices==null||prices.length==0)
            return 0;
          int[] left=new int[prices.length];
          int[] right=new int[prices.length];
          int localMax=0;
          int min=Integer.MAX_VALUE;
          for(int i=0;i<prices.length;i++){
              if(prices[i]<min){
                  min=prices[i];
              }else{
                  localMax=Math.max(localMax,prices[i]-min);
              }
              left[i]=localMax;
          }
          localMax=0;
          int max=Integer.MIN_VALUE;
          for(int i=prices.length-1;i>=0;i--){
              if(prices[i]>max){
                  max=prices[i];
              }else{
                  localMax=Math.max(localMax,max-prices[i]);
              }
              right[i]=localMax;
          }
          int maxProfit=0;
          for(int i=0;i<prices.length;i++){
              maxProfit=Math.max(maxProfit,left[i]+right[i]);
          }
          return maxProfit;
        }

 

123. Best Time to Buy and Sell Stock III

标签:

原文地址:http://www.cnblogs.com/zmyvszk/p/5516002.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!