返回
巧用动态规划!快速掌握LeetCode 309:最佳买卖股票时机含冷冻期
前端
2024-01-23 16:00:05
动态规划:渐进求解的利器
动态规划是一种强大的算法设计范式,它通过将问题分解为一系列子问题,逐步求解,最终得到问题的整体解决方案。对于LeetCode 309题,我们也可以使用动态规划来解决。
首先,我们需要明确问题:
- 给定一个数组prices,其中prices[i]是第i天股票的价格。
- 在股票交易中,您不能同时拥有多支股票。
- 股票在卖出后,您需要等待冷却期才能再次买入。
目标是找到最佳的买入和卖出股票时机,以获得最大的利润。
现在,让我们将问题分解成子问题:
- 在第i天,您有两种选择:买入股票或卖出股票。
- 如果您在第i天买入股票,那么您只能在第i+2天或以后卖出股票。
- 如果您在第i天卖出股票,那么您可以在第i+1天买入股票。
根据这些子问题,我们可以定义状态转移方程:
- dp[i][0]表示在第i天持有股票的最大利润。
- dp[i][1]表示在第i天不持有股票的最大利润。
然后,我们可以使用动态规划算法来求解这些子问题:
- 初始化:dp[0][0] = -prices[0],dp[0][1] = 0。
- 递推:对于i = 1到prices.length-1,
- dp[i][0] = max(dp[i-1][0], dp[i-2][1] - prices[i])
- dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])
最后,我们就可以得到最终答案:
max(dp[prices.length-1][0], dp[prices.length-1][1])
JavaScript实现:
const maxProfit = function(prices) {
if (prices.length <= 1) {
return 0;
}
const dp = new Array(prices.length).fill(0).map(() => new Array(2).fill(0));
dp[0][0] = -prices[0];
for (let i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(dp[i-1][0], dp[i-2][1] - prices[i]);
dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]);
}
return Math.max(dp[prices.length-1][0], dp[prices.length-1][1]);
};
结论:
通过使用动态规划,我们可以有效地解决LeetCode 309题,并找到最佳的股票买卖时机。希望这篇文章能够帮助您理解动态规划的思想和使用方法。如果您有任何问题或建议,欢迎随时与我联系。