【算法】力扣【动态规划、状态机】309. 买卖股票的最佳时机含冷冻期

这篇具有很好参考价值的文章主要介绍了【算法】力扣【动态规划、状态机】309. 买卖股票的最佳时机含冷冻期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


【算法】力扣【动态规划、状态机】309. 买卖股票的最佳时机含冷冻期

题目描述

本文介绍解决力扣平台上第309号问题——“买卖股票的最佳时机含冷冻期”的算法。这是一个中等难度的问题,其核心是通过设计一个算法来计算在给定的股票价格数组prices下,能够获取的最大利润。股票价格数组prices中的每个元素prices[i]表示第i天的股票价格。

题目的主要约束条件如下:

  • 卖出股票后,无法在第二天购买股票,即存在1天的冷冻期。
  • 不能同时进行多笔交易,即在再次购买前,必须出售掉之前的股票。

输入输出示例

  • 示例 1:

    输入: prices = [1,2,3,0,2]
    输出: 3
    
    • 解释:
      最优的交易方式为在第1天买入,第2天卖出,这时获得利润为1;第4天买入,第5天卖出,这时获得额外利润为2。因此,总利润为3。
  • 示例 2:

    输入: prices = [1]
    输出: 0
    
    • 解释:
      只有一个价格,故无法进行交易,最大利润为0。

解题思路

这个问题可以用动态规划(DP)来解决。我们定义两个动态规划数组dp[i][0]dp[i][1],其中:

  • dp[i][0]代表在第i天结束时,不持有股票的最大利润;
  • dp[i][1]代表在第i天结束时,持有股票的最大利润。

关键点澄清:

  • 在第i天卖出股票后,不能在第i+1天买入,这是由题目所规定的冷冻期导致的。

  • 如果第i天不持股,说明我们在第i天卖出了股票,或者在第 i - 1 天时就已经不持股。

  • 如果第i天持股,意味着我们要么是继续持有之前的股票,要么是在第i天买入。

    • 如果是买入第 i 天的股票,那么我们不能从dp[i-1][0]转移过来,只能从dp[i-2][0]转移过来。
    • 解释: 根据转移方程,“第i - 1天不持股”这一状态可以由两种状态转移过来:
      1. 卖出股票的操作转移而来,也就是dp[i][0] = dp[i-1][1] + prices[i],受冷冻期影响,此时只能从dp[i-2][0]转移过来。
      2. 继续保持第 i - 2 天不持股的状态,也就是dp[i][0] = dp[i-1][0],此时dp[i-2][0]等价于dp[i-1][0]
      • 综上所述,无论第 i - 1 有没有卖出股票, 只要从dp[i-2][0]转移过来,就能保证正确性。

状态转移方程

  • 不持股: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])

边界条件

  • dp[0][0]初始化为0,因为在开始时我们不可能有利润。
  • dp[0][1]初始化为负无穷,这表示我们不可能在第0天就持有股票,让从“第0天持股”转移而来的状态变成一个最不可能的答案。

C++代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if(n == 1) return 0; // 只有一天,不可能有交易

        // 初始化dp数组
        vector<vector<int>> dp(n, vector<int>(2, 0));
        dp[0][1] = -prices[0]; // 第一天买入股票
        dp[0][0] = 0; // 第一天不可能卖出股票

        for(int i = 1; i < n; ++i) {
            // 第i天不持股的情况下,可能是第i-1天就不持股,或者是第i天卖出股票
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);
            // 第i天持股的情况下,可能是第i-1天就持股,或者是第i天买入股票
            dp[i][1] = max(dp[i-1][1], (i >= 2 ? dp[i-2][0] : 0) - prices[i]);
        }

        return dp[n-1][0]; // 返回最后一天不持股的情况,即可能的最大利润
    }
};

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中n是数组prices的长度。我们只需要遍历一次数组,对于每一天,计算不持股和持股的最大利润。
  • 空间复杂度: O ( n ) O(n) O(n),用于存储动态规划数组。

总结

本文通过动态规划的方法解决了买卖股票的最佳时机含冷冻期的问题,强调了理解状态转移方程在解题过程中的重要性,并通过边界条件和状态方程的详细解释,保证了解题思路的清晰性和逻辑性。代码块中的注释也为理解每一步操作提供了方便。希望此篇博客对读者有所帮助。文章来源地址https://www.toymoban.com/news/detail-802789.html

到了这里,关于【算法】力扣【动态规划、状态机】309. 买卖股票的最佳时机含冷冻期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣 309. 买卖股票的最佳时机含冷冻期

    题目来源:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/ C++题解:动态规划 状态1:表示持有股票。更新为之前持有股票(dp[i-1][0])或者不持有股票且不处于冷冻期后买入(dp[i-1][2]-prices[i])。 状态2:表示不持有股票且处于冷冻期,即卖出。更新为持有

    2024年02月22日
    浏览(33)
  • 动态规划-状态机(188. 买卖股票的最佳时机 IV)

    状态分类: f[i,j,0]考虑前i只股票,进行了j笔交易,目前未持有股票 所能获得最大利润 f[i,j,1]考虑前i只股票,进行了j笔交易,目前持有股票 所能获得最大利润 状态转移: f[i][j][0] = Math.max(f[i-1][j][0],f[i-1][j][1]+prices[i]); f[i][j][1] = Math.max(f[i-1][j][1],f[i-1][j-1][0]-prices[i]);   还有一位

    2024年02月08日
    浏览(43)
  • 动态规划--买卖股票含冷冻期309

            这道题很明显下一天的利润需要由上一天的状态推导出来,所以这是很明显的动态规划问题         普通的股票问题有两种状态:持有股票的利润,不持有股票的利润,但这道题有一个冷冻期,使得这道题有4种状态:         1、 持有股票的利润 ;         

    2024年04月28日
    浏览(34)
  • 算法[动态规划]---买卖股票最佳时机

    1、题目: 给你一个整数数组 prices,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持一股股票。你也可以先购买,然后在同一天出售。 返回你能获得的最大利润 。 2、 分析特点: 题目要求:在任何时候最多

    2024年02月09日
    浏览(41)
  • 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

    力扣题目链接(opens new window) 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)

    2024年01月16日
    浏览(43)
  • 【第51天| 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 】

    三个状态: 1. 当前持有股票 状态1 2. 当前不持有股票,且不是今天卖出的股票 状态2 3. 当前不持有股票, 且股票是今天卖出的 状态3 题目要求前一天卖出了股票今天就不能买。所以今天持有股票 状态1 一定是昨天的 状态2 在今天买了股票,或者就是保持了昨天的 状态1 。 状

    2024年02月08日
    浏览(41)
  • 【LeetCode】309. 买卖股票的最佳时机含冷冻期

    给定一个整数数组 prices ,其中第    prices[i]  表示第  i  天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 注意: 你不能同时参与

    2024年02月10日
    浏览(43)
  • 动态规划——买卖股票的最佳时机系列题

    买卖股票有一系列题目 以下是我找出它们之间的区别: 第一题,只能买一次,从最低价入手,最高价卖出 第二题,可以买无数次,但买了之后,必须卖出之后,再来重新买入,再卖出。 第三题,只能买两次,但买了之后,必须卖出之后,再来重新买入,再卖出。 第四题,

    2024年01月17日
    浏览(50)
  • LeetCode:121.买卖股票的最佳时机——动态规划

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 关于动态规划:LeetCode:322. 零钱兑换——动态规划从案例入门 题目描述 :给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只

    2023年04月17日
    浏览(38)
  • 动态规划——买卖股票的最佳时机系列题Ⅱ

    这一期是和上一期是连着的,包含的题目如下: 这三个题目所需要的思路是很相近的,先给出第一个的题目。 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时

    2024年01月19日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包