
LeetCode Best Time to Buy and Sell Stock with Cooldown
buy(当前的价格):表示买入股票时的价格。 sell(当前的价格):表示卖出股票时的价格。 rest(当前的价格):表示已经卖出股票并处于等待状态的情形。
发布日期:2025-04-05 00:47:47
浏览次数:11
分类:精选文章
本文共 1417 字,大约阅读时间需要 4 分钟。
问题分析:在股票交易中实现最大利润
想象一下,你有一个股票价格数组,其中每个元素代表某只股票在特定日期的价格。你的任务是设计一个算法,通过多次买卖股票,获取最大可能的利润。与传统的买卖股票问题不同,这里的交易有一些特定的限制条件:不能同时进行多次交易,且在卖完股票后,必须等待至少一天才能再次进行买入。
解决思路:引入状态变量
为应对这种限制条件,我们可以使用动态规划的方法来维护几个关键的状态变量:
通过遍历价格数组,我们可以根据这些状态变量来决定是否进行买入和卖出,从而最大化利润。
状态转移
每一步,我们都会根据前一次的状态来决定当前的操作:
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),非常适用于大型数据量的股票价格数组。
总结
通过引入buy
、sell
和rest
这三个状态变量,我们可以有效地处理等待一天后再买入的情况,从而在有限交易次数的情况下实现最大收益。这种方法不仅逻辑清晰,而且能够高效地解决问题。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月27日 08时34分48秒
关于作者

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