Day53~309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

31 阅读2分钟

摘要

本文主要介绍了LeetCode动态规划的几个题目,包括309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费,并在最后对股票问题进行了总结。

1、309.最佳买卖股票时机含冷冻期

1.1 思路

309.最佳买卖股票时机含冷冻期

  • dp 数组以及下标的含义

    • dp[0][i] 代表买入股票的最大金额
    • dp[1][i] 代表卖出股票的最大金额
    • dp[2][i] 代表冷冻期的最大金额
  • 递推公式

    • dp[0][i] = Math.max(dp[0][i-1], dp[2][i-1] - prices[i])
    • dp[1][i] = Math.max(dp[1][i-1], dp[0][i-1] + prices[i])
    • dp[2][i] = dp[1][i-1]
  • dp 数组如何初始化

    • dp[0][0] = - prices[i]
    • dp[1][0] = 0
    • dp[2][0] = 0
  • dp 数组遍历顺序

    • 从前向后遍历
  • 打印 dp 数组

    • 以 [1,2,3,0,2] 为例,dp数组如下:
    • 309.最佳买卖股票时机含冷冻期

1.2 代码

    public int maxProfit(int[] prices) {
        int len = prices.length;
        int[][] dp = new int[3][len];
        dp[0][0] = -prices[0];
        dp[1][0] = 0;
        dp[2][0] = 0;
​
        for(int i=1; i<len; i++) {
            dp[0][i] = Math.max(dp[0][i-1], dp[2][i-1] - prices[i]);
            dp[1][i] = Math.max(dp[1][i-1], dp[0][i-1] + prices[i]);
            dp[2][i] = dp[1][i-1];
        }
        return dp[1][len-1];
    }

2、714.买卖股票的最佳时机含手续费

2.1 思路

  • 动规五部曲

    • dp 数组以及下标的含义

      • dp[0][i] 持有股票的最大金额;dp[1][i] 不持有的最大金额;
    • 递推公式

      • 本题和动态规划:122.买卖股票的最佳时机II的区别就是这里需要多一个减去手续费的操作
      • dp[0][i] = Math.max(dp[0][i-1], dp[1][i-1] - prices[i])
      • dp[1][i] = Math.max(dp[1][i-1], dp[0][i-1] + prices[i] - fee)
    • dp 数组如何初始化

      • dp[0][0] = -prices[0]
    • dp 数组遍历顺序

      • 从前向后遍历
    • 打印 dp 数组

  • 注意事项

    • dp 数组初始化

      • 持有:dp[0][0] = -prices[0]
      • 不持有:dp[1][0] = 0

2.2 代码

    public int maxProfit(int[] prices, int fee) {
        int len = prices.length;
        int[][] dp = new int[2][len];
        dp[0][0] = -prices[0];
        dp[1][0] = 0;
​
        for(int i=1; i<len; i++) {
            dp[0][i] = Math.max(dp[0][i-1], dp[1][i-1] - prices[i]);
            dp[1][i] = Math.max(dp[1][i-1], dp[0][i-1] + prices[i] - fee);
        }
        return dp[1][len-1];
    }
}

3、股票总结

309.最佳买卖股票时机含冷冻期

参考资料

代码随想录-309.最佳买卖股票时机含冷冻期

代码随想录-714.买卖股票的最佳时机含手续费