[HOT 100] 0309. 买卖股票的最佳时机含冷冻期

1. 题目链接


309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode)


2. 题目描述


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

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

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

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

3. 题目示例


示例 1 :

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

示例 2 :

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

4. 解题思路


  1. 问题理解:这是带冷冻期的股票买卖问题,在卖出股票后需要等待一天才能再次买入。
  2. 状态定义
    • f0:表示前一天不持有股票的最大利润
    • f1:表示前一天持有股票的最大利润
    • pre0:表示两天前不持有股票的最大利润(用于处理冷冻期)
  3. 状态转移
    • 当天不持有股票的最大利润newF0
      • 保持前一天不持有的状态(f0
      • 或者卖出前一天持有的股票(f1 + p
    • 当天持有股票的最大利润f1
      • 保持前一天持有的状态(f1
      • 或者两天前不持有,今天买入(pre0 - p,考虑冷冻期)
  4. 冷冻期处理
    • 通过pre0变量记录两天前的状态
    • 买入操作只能基于两天前不持有股票的状态(因为卖出后需要冷冻一天)
  5. 初始化
    • f0 = 0:初始时没有持有股票,利润为0
    • f1 = Integer.MIN_VALUE:初始时不可能持有股票,设为负无穷
    • pre0 = 0:初始时两天前的状态也是0

5. 题解代码


class Solution {
    public int maxProfit(int[] prices) {
        int pre0 = 0;        // 表示i-2天不持有股票的最大利润(用于处理冷冻期)
        int f0 = 0;          // 表示i-1天不持有股票的最大利润
        int f1 = Integer.MIN_VALUE; // 表示i-1天持有股票的最大利润(初始设为负无穷表示不可能)
        
        for (int p : prices) { // 遍历每一天的价格
            int newF0 = Math.max(f0, f1 + p); // 当天不持有股票的最大利润:
                                              // 1. 前一天就不持有(f0)
                                              // 2. 前一天持有,今天卖出(f1 + p)
            f1 = Math.max(f1, pre0 - p);      // 当天持有股票的最大利润:
                                              // 1. 前一天就持有(f1)
                                              // 2. 两天前不持有,今天买入(pre0 - p,考虑冷冻期)
            pre0 = f0;       // 更新pre0为前一天的f0(即i-1天的状态)
            f0 = newF0;      // 更新f0为当前天的状态
        }
        return f0; // 最后一天不持有股票才能获得最大利润
    }
}


6. 复杂度分析


时间复杂度:O(n),其中n是价格数组的长度。我们只需要遍历价格数组一次,每次迭代执行常数时间的操作。

空间复杂度:O(1),只使用了常数个额外变量(pre0、f0和f1)来存储状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值