Leetcode--309. 最佳买卖股票时机含冷冻期
发布日期:2021-04-30 21:01:34 浏览次数:95 分类:精选文章

本文共 1193 字,大约阅读时间需要 3 分钟。

为了解决这个问题,我们需要设计一个算法来计算股票交易中的最大利润,考虑到冷冻期的约束。具体来说,我们可以使用动态规划的方法来解决这个问题,维护两个状态:持有股票和不持有股票。

方法思路

我们定义两个状态:

  • dp[i][0] 表示到第 i 天结束时,手中没有股票的情况下,最大的利润。
  • dp[i][1] 表示到第 i 天结束时,手中持有股票的最大利润。

状态转移方程如下:

  • dp[i][0] 可以从 dp[i-1][0] 或者 dp[i-1][1] + prices[i] 得到最大值。
  • dp[i][1] 可以从 dp[i-1][0] - prices[i] 或者 dp[i-2][0] - prices[i] 得到最大值。这里,dp[i-2][0] 是为了处理冷冻期的情况。

解决代码

class Solution {    public int maxProfit(int[] prices) {        if (prices.length == 0) {            return 0;        }        int[][] dp = new int[prices.length][2];        dp[0][0] = 0;        dp[0][1] = -prices[0];        for (int i = 1; i < prices.length; i++) {            dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]);            dp[i][1] = Math.max(                dp[i-1][0] - prices[i],                (i >= 2 ? dp[i-2][0] : 0) - prices[i            );        }        return dp[prices.length-1][0];    }}

代码解释

  • 初始化:创建一个二维数组 dp,其中 dp[i][0]dp[i][1] 分别表示不持有股票和持有股票的情况。
  • 基例:设置 dp[0][0] 为 0,表示第一天不持有股票利润为 0,dp[0][1] 为 -prices[0],表示第一天持有股票的利润为负。
  • 动态规划:从第二天开始遍历,计算每一天的两种状态。
    • dp[i][0] 是从前一天的状态转移而来,考虑持有或不持有股票的情况。
    • dp[i][1] 考虑冷冻期,确保不能在卖出后立即买入,通过检查前两天的状态来处理。
  • 返回结果:最终返回 dp[prices.length-1][0],表示在最后一天不持有股票时的最大利润。
  • 这种方法确保了在满足冷冻期约束的情况下,能够计算出最大利润。

    上一篇:java基础-Java集合框架-Map接口-Collections工具类以及Map的总结
    下一篇:zkui windows版 zookeeper UI监控

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2026年05月24日 09时03分49秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章