123. 买卖股票的最佳时机 III

image.png
image.png

动态规划

  1. class Solution {
  2. public int maxProfit(int[] prices) {
  3. /**dp[i][0] 没有操作
  4. * dp[i][1] 第一次买入
  5. * dp[i][2] 第一次卖出
  6. * dp[i][3] 第二次买入
  7. * dp[i][4] 第二次卖出
  8. */
  9. int size = prices.length;
  10. int [][] dp = new int[size][5];
  11. dp[0][0] = 0;
  12. dp[0][1] = -prices[0];
  13. dp[0][2] = 0;
  14. dp[0][3] = -prices[0];
  15. dp[0][4] = 0;
  16. for(int i = 1; i < size; i++ ) {
  17. dp[i][0] = dp[i - 1][0];
  18. dp[i][1] = Math.max(dp[i - 1][1],dp[i - 1][0] - prices[i]);
  19. dp[i][2] = Math.max(dp[i - 1][2],dp[i - 1][1] + prices[i]);
  20. dp[i][3] = Math.max(dp[i - 1][3],dp[i - 1][2] - prices[i]);
  21. dp[i][4] = Math.max(dp[i - 1][4],dp[i - 1][3] + prices[i]);
  22. }
  23. return dp[size - 1][4];
  24. }
  25. }

优化空间

  1. class Solution {
  2. public int maxProfit(int[] prices) {
  3. /**dp[0] 没有操作
  4. * dp[1] 第一次买入
  5. * dp[2] 第一次卖出
  6. * dp[3] 第二次买入
  7. * dp[4] 第二次卖出
  8. */
  9. int size = prices.length;
  10. int [] dp = new int[5];
  11. dp[0] = 0;
  12. dp[1] = -prices[0];
  13. dp[2] = 0;
  14. dp[3] = -prices[0];
  15. dp[4] = 0;
  16. for(int i = 1; i < size; i++ ) {
  17. dp[0] = dp[0];
  18. dp[1] = Math.max(dp[1],dp[0] - prices[i]);
  19. dp[2] = Math.max(dp[2],dp[1] + prices[i]);
  20. dp[3] = Math.max(dp[3],dp[2] - prices[i]);
  21. dp[4] = Math.max(dp[4],dp[3] + prices[i]);
  22. }
  23. return dp[4];
  24. }
  25. }