LeetCode Best Time to Buy and Sell Stock with Cooldown
发布日期:2025-04-05 00:47:47 浏览次数:11 分类:精选文章

本文共 1417 字,大约阅读时间需要 4 分钟。

问题分析:在股票交易中实现最大利润

想象一下,你有一个股票价格数组,其中每个元素代表某只股票在特定日期的价格。你的任务是设计一个算法,通过多次买卖股票,获取最大可能的利润。与传统的买卖股票问题不同,这里的交易有一些特定的限制条件:不能同时进行多次交易,且在卖完股票后,必须等待至少一天才能再次进行买入。

解决思路:引入状态变量

为应对这种限制条件,我们可以使用动态规划的方法来维护几个关键的状态变量:

  • buy(当前的价格):表示买入股票时的价格。
  • sell(当前的价格):表示卖出股票时的价格。
  • rest(当前的价格):表示已经卖出股票并处于等待状态的情形。
  • 通过遍历价格数组,我们可以根据这些状态变量来决定是否进行买入和卖出,从而最大化利润。

    状态转移

    每一步,我们都会根据前一次的状态来决定当前的操作:

  • buy状态

    • buy[i] = max(rest[i-1] - price[i], buy[i-1])
    • 这里的 rest[i-1] 表示在等待状态下的最高价格减去当前价格,如果大于 buy[i-1],则选择 rest[i-1] 来买入;反之,则选择之前的买入价格。
  • sell状态

    • sell[i] = max(buy[i] + price[i], sell[i-1])
    • 这里,当前的 buy[i] 为最新的买入价格,加上当前的价格就是卖出的价格。我们选择 sell[i-1]buy[i] + price[i] 中的较大者。
  • rest状态

    • 如果已经卖出或者处于等待状态,下一次只能选择等待或者重新买入。
    • rest[i] = max(sell[i-1], rest[i-1])
    • 等待状态的最高价格必须来自于上一次的卖出状态,同时也可能保持前一次的等待状态。
  • 代码实现:

    int maxProfit(int[] prices) {    int preBuy = Integer.MIN_VALUE;    int buy = preBuy;    int preSell = 0;    int sell = 0;    for (int price : prices) {        preBuy = buy; // 上次可能的价格变成当前的买入状态        buy = Math.max(preSell - price, preBuy);        preSell = sell; // 上一次卖出的状态        sell = Math.max(buy + price, preSell);        // 如果当前的买入后的利润小于卖出后的利润,则保持不变    }    return sell;}

    代码解释:

    • preBuy:保持上一次的买入价格。
    • buy:记录当前能买入的价格,或者是从等待状态下的最高价格减去当前价格后的价格。
    • preSell:当前卖出后的价格。
    • sell:记录当前卖出后的最高价格。

    通过这种状态转移方式,我们可以确保在每一天尽可能地进行更多的交易,同时遵守等待一天的规则。

    优化和考虑

    这个方法的时间复杂度是 O(n),空间复杂度是 O(1),非常适用于大型数据量的股票价格数组。

    总结

    通过引入buysellrest这三个状态变量,我们可以有效地处理等待一天后再买入的情况,从而在有限交易次数的情况下实现最大收益。这种方法不仅逻辑清晰,而且能够高效地解决问题。

    上一篇:Leetcode dfs Combination SumII
    下一篇:LeetCode AutoX 安途智行专场竞赛题解

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月27日 08时34分48秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章