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],表示在最后一天不持有股票时的最大利润。这种方法确保了在满足冷冻期约束的情况下,能够计算出最大利润。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2026年05月24日 09时03分49秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!