LeetCode 动态规划之最佳买卖股票时机含冷冻期

简介: 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


题解


解题分析


题解思路


  1. 由题意可知,我们最多只能同时买入一支股票,并且卖出股票后又冷冻期的限制,在某一天我们有三种不同的状态:


  • 我们目前持有一支股票,对应的「累计最大收益」记为 f0;
  • 我们目前不持有任何股票,并且处于冷冻期中,对应的「累计最大收益」记为 f1
  • 我们目前不持有任何股票,并且不处于冷冻期中,对应的「累计最大收益」记为 f2


  1. 那么我们就围绕三种状态进行分析。


  • 如果当前持有股票最大收益 f0 = max(f1, f2 - price[i])
  • 如果当天难处于冷冻期当前最大收益 f1 = f0 + price[i]
  • 如果当天不处于冷冻期中,丹铅最大收益为 f2 = max(f1, f2)


  1. 我们只需要通过循环不断的去计算三个值,最后返回合适的结果即可


复杂度分析


  • 时间复杂度:O(N)


  • 空间复杂度:O(1), 我们没有创建额外的数组来存储。


解题代码


题解代码如下(代码中有详细的注释说明):


class Solution {
    public int maxProfit(int[] prices) {
        // 判断有效的参数
        if (prices == null || prices.length == 0) {
            return 0;
        }
        // 获取数组长读
        int n = prices.length;
        // f0, f1, f2 默认值分别是 -prices[0], 0, 0
        // 因为第一天是负收益
        int f0 = -prices[0], f1 = 0, f2 = 0;
        for (int i = 1; i < n; i++) {
            int newf0 = Math.max(f0, f2 - prices[i]);
            int newf1 = f0 + prices[i];
            int newf2 = Math.max(f1, f2);
            f0 = newf0;
            f1 = newf1;
            f2 = newf2;
        }
        return Math.max(f1, f2);
    }
}


提交后反馈结果:


image.png


参考信息




相关文章
|
3月前
|
算法 Python
【Leetcode刷题Python】309. 最佳买卖股票时机含冷冻期
解决LeetCode上309题“最佳买卖股票时机含冷冻期”的Python代码示例,利用动态规划方法计算在含有冷冻期约束下的最大利润。
43 1
|
3月前
|
算法 Python
【Leetcode刷题Python】121. 买卖股票的最佳时机
解决LeetCode上121题“买卖股票的最佳时机”的Python代码示例,采用一次遍历的方式寻找最佳买卖时机以获得最大利润。
62 1
|
3月前
|
算法
leetcode188 买卖股票的最佳时机IV
leetcode188 买卖股票的最佳时机IV
62 0
|
3月前
|
算法 Python
【Leetcode刷题Python】714. 买卖股票的最佳时机含手续费
提供了两种解决买卖股票最佳时机含手续费问题的Python实现方法:贪心算法和动态规划算法。
46 0
|
3月前
|
算法 Python
【Leetcode刷题Python】122.买卖股票的最佳时机 II
LeetCode "买卖股票的最佳时机 II" 问题的Python代码实现,采用贪心算法在股票价格上升的每一天买入并卖出,以获得最大利润。
21 0
|
5月前
|
算法 索引
力扣每日一题 6/28 动态规划/数组
力扣每日一题 6/28 动态规划/数组
52 0
|
5月前
|
存储
力扣每日一题 6/19 排序+动态规划
力扣每日一题 6/19 排序+动态规划
30 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2