​LeetCode刷题实战309:最佳买卖股票时机含冷冻期

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 最佳买卖股票时机含冷冻期,我们先来看题面:

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/

You are given an array prices where prices[i] is the price of a given stock on the ith day.

Find the maximum profit you can achieve. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times) with the following restrictions:

  • After you sell your stock, you cannot buy stock on the next day (i.e., cooldown one day).

  • Note: You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例

输入: [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

解题

https://blog.csdn.net/Cypresszky/article/details/105916407

动态规划:

这道题是【买卖股票的最佳时机II】的变形,因为也是不限制交易次数,只是交易完一次后要冷冻一天,假设今天是第i天dp[i][1]表示要持有股票,与dp[i-2][0]前两天(前一天的前一天)卖出股票的利润有关。

1)dp数组的含义:前i天交易的最大利润

dp[i][0]:第i天不持有股票

dp[i][1]:第i天持有股票

2)状态转移方程:

所以状态转移方程基本一样,变化的地方就是-1,变成-2

dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]);//今天要持有股票,那么选择前一天不持有股票和前一天持有股票今天卖掉了股票中的最大利润。

dp[i][1] = max(dp[i-1][1],dp[i-2][0]-prices[i]);//今天要持有股票。前两天的交易了一次,中间休息了一天,今天买入;前一天本就持有股票,今天不买卖股票。

class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        if(len <= 1) return 0;
     int[][] dp = new int[len][2];
     dp[0][0] = 0;
     dp[0][1] = -prices[0];
     dp[1][0] = Math.max(dp[0][0], dp[0][1] + prices[1]);
     dp[1][1] = Math.max(dp[0][0] - prices[1], dp[0][1]);
     for(int i = 2; i < len; i++) {
       dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]);//这次要手上没有股票
       dp[i][1] = Math.max(dp[i-2][0] - prices[i], dp[i-1][1]);//那么上场进行了交易要休息一天
     }
     return dp[len-1][0];
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-280题汇总,希望对你有点帮助!

LeetCode刷题实战301:删除无效的括号

LeetCode刷题实战302:包含全部黑色像素的最小矩阵

LeetCode刷题实战303:区域和检索 - 数组不可变

LeetCode刷题实战304:二维区域和检索 - 矩阵不可变

LeetCode刷题实战305:岛屿数量II

LeetCode刷题实战306:累加数

LeetCode刷题实战307:区域和检索 - 数组可修改

LeetCode刷题实战308:二维区域和检索 - 可变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值