/* * 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; }
时间: 2024-10-07 08:12:22