携手创作,共同成长!这是我参与「掘金日新计划 · 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 <= 50000 <= 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)
结语
本题确定好四个状态,就很好解决,可以使用一维数组,也可以使用二维数组,时间复杂度:,空间复杂度: