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

109 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

一、题目

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

给定一个整数数组prices,其中第  prices[i] 表示第 i 天的股票价格 。​

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

卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

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

示例 2:

输入: prices = [1]
输出: 0

提示:

1 <= prices.length <= 5000
0 <= prices[i] <= 1000

二、题解

方法一

想要获得盈利,就得在低价买入然后高价卖出,但是卖出之后需要隔一天才能继续买入。对此我们可以使用动态规划,记录每一天之后当前可以获得的最大收益;根据题意可以知道,在每一天结束的时候可以存在三种情况,第一种情况就是目前持有一支股票;第二中情况就是目前没有持有股票但是在冷冻期,也就是无法买入股票;第三种情况就是目前没有持有股票但是不在冷冻期,可以买入股票。具体的定义dp1数组,dp1[i]就表示第i天结束时持有一支股票能获取的最大收益;定义dp2数组,dp2[i]就表示第i天结束时不持有股票并且是在冷冻期的情况下获取的最大收益;定义dp3数组,dp3[i]就表示第i天结束时不持有股票并且不是在冷冻期的情况下获取的最大收益。那么dp1[i]就等于前一天持有股票的收益dp1[i - 1]和前一天不持有股票并且可以在今天买入一支股票的收益dp3[i - 1] - prices[i]中较大的一个收益。dp2[i]就等前一天持有股票的收益加上今天卖出持有股票的收益dp1[i - 1] + prices[i]。最后dp3[i]就等前一天不持有股票并且不在冷冻期的收益dp3[i - 1]和前一天不持有股票并且在冷冻期的收益dp2[i - 1]中较大的收益。一开始的第一天买入股票获取的收益即是-prices[0],最后不持有股票的情况下的收益是大于持有股票的收益的,所以返回不持有股票的情况下最大的收益就可以了。

三、代码

方法一 Java代码

class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        int[] dp1 = new int[len];
        int[] dp2 = new int[len];
        int[] dp3 = new int[len];
        dp1[0] = -prices[0];
        for (int i = 1; i < len; ++i) {
            dp1[i] = Math.max(dp1[i - 1], dp3[i - 1] - prices[i]);
            dp2[i] = dp1[i - 1] + prices[i];
            dp3[i] = Math.max(dp2[i - 1], dp3[i - 1]);
        }
        return Math.max(dp2[len - 1], dp3[len - 1]);
    }
}

时间复杂度:O(n),需要遍历一次数组。

空间复杂度:O(n),需要三个对应大小的数组记录状态。