123. 买卖股票的最佳时机 III - Java 动态规划
                
            
             
        
            
            原题地址:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/ 
题解
设dp[i][j]为在第i天进行了j操作后的最大利润,其中
- j=0为第一次买入
 
- j=1为第一次卖出
 
- j=2为第二次买入
 
- j=3为第二次卖出
 
对于第一次买入,我们在此之前由于未进行任何操作,利润必然是负的,即
对于第一次卖出,我们只需要找到第一次买入时的利润最大值(dp[j][0]都为负数,越大的值代表买入的成本越少),加上卖出的利润即可,即
对于第二次买入,我们只需要找到第一次卖出时的利润最大值,减去买入的成本,即
对于第二次卖出,我们只需要找到第二次买入时的利润最大值,加上卖出的利润即可,即
由于存在prices中只支持一次买入卖出的操作的可能性,答案需要在第一次卖出和第二次卖出的所有值中寻找最大值
时间复杂度:O(N)
空间复杂度:O(N)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
   | class Solution {     public int maxProfit(int[] prices) {         if(prices.length==1)return 0;         int[][] dp=new int[prices.length][4];         int max1in=Integer.MIN_VALUE,max2in=Integer.MIN_VALUE;         int max1out=Integer.MIN_VALUE,max2out=Integer.MIN_VALUE;                  for (int i=0;i<prices.length;i++){             dp[i][0]=0-prices[i];             max1in=Math.max(max1in,dp[i][0]);             if(i>0){                 dp[i][1]=max1in+prices[i];                 max1out=Math.max(max1out,dp[i][1]);             }             if(i>1){                 dp[i][2]=max1out-prices[i];                 max2in=Math.max(max2in,dp[i][2]);             }             if(i>2){                 dp[i][3]=max2in+prices[i];                 max2out=Math.max(max2out,dp[i][3]);             }         }         return Math.max(max2out,max1out);     } }
  |