leetcode hot100之最佳买卖股票时机含冷冻期(309)解析

187 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情


前言

  • leetcode hot100,是大厂面试高频题,也是必刷算法题。精选了100道LeetCode上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,按照官方说的,熟练掌握这 100 道题,就具备了代码世界通行的基本能力。

leetcode309题(# 最佳买卖股票时机含冷冻期

本文来讲hot100第309题(最佳买卖股票时机含冷冻期),本题也是比较典型动态规划应用的题目,与常规的买卖股票不同,本题目包含了冷冻期,状态是比较复杂的,要考虑多个因素。

给定一个整数数组prices,其中第 **prices[i] 表示第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例:

输入: prices = [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
输入: prices = [1]
输出: 0

提示:

  • 1 <= prices.length <= 5000
  • 0 <= prices[i] <= 1000

分析

  • 数组prices存储的值是每天的股票
  • 假设第一天买股票,那么只有第二天可以卖,第二天卖股票,必须第四天才可以再次买入(第三天空着)
  • 只能同时进行一笔交易,所以要想卖,必须手上是有股票的,要想买必须没有持有的股票
  • 卖出股票,第二天需要冷冻交易一天
  • 求最大利润

思路

  • 由于冷冻期原因,我们可以把股票交易分为四个状态
    • 状态一:买入股票状态(今天买入股票,或者是之前就买入了股票然后没有操作)
    • 状态二:两天前就卖出了股票,度过了冷冻期,一直没操作,今天保持卖出股票状态(卖出股票状态)
    • 状态三:今天卖出了股票(卖出股票状态)
    • 状态四:今天为冷冻期状态,只有一天
  • 掌握好这四个状态,本题和其他的动态规划没有区别
  • 确定递推公式
  • dp数组初始化
  • 确定遍历顺序
  • 举例推导

代码

  const n = prices.length
  const dp = new Array(4).fill(0)
  dp[0] = -prices[0]
  for (let i = 1; i < n; i ++) {
    const temp = dp[0] // 缓存上一次的状态
    const temp1 = dp[2]
    dp[0] = Math.max(dp[0], Math.max(dp[3] - prices[i], dp[1] - prices[i])) // 持有状态
    dp[1] = Math.max(dp[1], dp[3]) // 今天不操作且不持有股票
    dp[2] = temp + prices[i] // 今天卖出股票
    dp[3] = temp1 // 冷冻期
  }
  return Math.max(...dp)

结语

本题确定好四个状态,就很好解决,可以使用一维数组,也可以使用二维数组,时间复杂度:O(n)O(n),空间复杂度:O(n)O(n)