返回

巧用动态规划!快速掌握LeetCode 309:最佳买卖股票时机含冷冻期

前端

动态规划:渐进求解的利器

动态规划是一种强大的算法设计范式,它通过将问题分解为一系列子问题,逐步求解,最终得到问题的整体解决方案。对于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题,并找到最佳的股票买卖时机。希望这篇文章能够帮助您理解动态规划的思想和使用方法。如果您有任何问题或建议,欢迎随时与我联系。