今天是 Kevin 的算法之路的第 16 天。为大家讲解 LeetCode 第 309 题,是昨天带来的 todo链接 的一个升级版,不了解的朋友建议先去康康。

每日一笑

“你为什么选择我们公司?”

脑子:“因为没钱啊,那你以为呢?”

嘴巴:“当然是因为你们公司balabala……”

题目描述

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。

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

你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

动态规划

了解的朋友可能知道「买股票」有一系列的题目,可以的话我会一一讲解。

这一系列的题也正涉及了重要的「动态规划」,关于动态规划可以看我今天分享的小浩算法的那篇文章。

这里先区别一下「买股票」系列中这道题的不同:

这道题增加了「冷冻期」这样一个条件,没有限制多少笔交易。因此只需要增加一个状态。

第一步:状态定义

dp[i][j] 表示[0, i]区间内,在下标为i这一天状态为j时的最大收益。

这里j取三个值:

  • 0 表示不持股;
  • 1 表示持股;
  • 2 表示处在冷冻期。

第二部:状态转移方程

这步是至关重要也是最难的,得知状态转移方程的关键是理解题意,理清逻辑。

  • 不持股可以由这两个状态转换而来:
    昨天不持股,今天什么都不操作,仍然不持股;
    昨天持股,今天卖了一股。
  • 持股可以由这两个状态转换而来:
    昨天持股,今天什么都不操作,仍然持股;
    昨天处在冷冻期,今天买了一股;
  • 处在冷冻期比较特殊,只可以由不持股转换而来,因为题目中说,刚刚把股票卖了,需要冷冻 1 天。(持股卖了变成不持股,再变成冷冻期)

以上分析可以用下图表示:

第三步:初始化(base case)

在第 0 天,不持股的初始化值为 0

持股的初始化值为 -prices[0](表示购买了一股),

虽然不处于冷冻期,但是初始化的值可以为 0

第四步:返回值

每一天都由前面几天的状态转换而来,最优值在最后一天。取不持股和冷冻期的最大者。

代码实现

//go
func maxProfit(prices []int) int {length := len(prices)// 特殊判断if length <= 1 {return 0}// 声明dpdp := make([][3]int, length)// 初始化dp[0][0] = 0          // 【0天】【不持股】dp[0][1] = -prices[0] // 【0天】【持股】dp[0][2] = 0          // 【0天】【冷冻期】for i := 1; i < length; i++ {// 【第i天】【不持股】 = max(昨天不持股今天不操作,昨天持股+今天卖一股)dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i])// 【第i天】【持股】 = max(昨天持股今天不操作,昨天冷冻期+今天买一股)dp[i][1] = max(dp[i-1][1], dp[i-1][2]-prices[i])// 【第i天】【冷冻期】 = 昨天卖了不持股dp[i][2] = dp[i-1][0]}// 返回不持股和冷冻期的最大者return max(dp[length-1][0], dp[length-1][0])
}func max(x, y int) int {if x > y {return x}return y
}
//java
public class Solution {public int maxProfit(int[] prices) {int len = prices.length;// 特判if (len < 2) {return 0;}int[][] dp = new int[len][3];// 初始化dp[0][0] = 0;dp[0][1] = -prices[0];dp[0][2] = 0;for (int i = 1; i < len; i++) {dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][2] - prices[i]);dp[i][2] = dp[i - 1][0];}return Math.max(dp[len - 1][0], dp[len - 1][2]);}
}

郑重声明:

所展示代码已通过 LeetCode 运行通过,请放心食用~

在唠唠嗑

很多人都想养成好习惯,但大多数人却是三分钟热度。为了我们能一起坚持下去,决定制定如下计划(福利)

一起学算法,打卡领红包!

参与方式:

关注我的微信公众号「Kevin的学堂」

还可「加群」与众多小伙伴

一起坚持,一起学习,一起更优秀!

打卡规则为:

「留言」“打卡XXX天” ➕「分享」到朋友圈

奖励:

连续打卡 21 天,联系本人获取 6.6 元红包一个!

连续打卡 52 天,联系本人获取 16.6 元红包一个!

连续打卡 100 天,联系本人获取 66.6 元红包一个!

leetcode|割冷冻韭菜的最佳时机相关推荐

  1. LeetCode 188. 买卖股票的最佳时机 IV(动态规划)

    1. 题目 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多笔交易(你必须在再次购买 ...

  2. LeetCode 123. 买卖股票的最佳时机 III(动态规划)

    1. 题目 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你必须在再次购买 ...

  3. LeetCode #121 买卖股票的最佳时机 贪心 单调栈 动态规划

    LeetCode #121 买卖股票的最佳时机 题目描述 给定一个数组,它的第 iii 个元素是一支给定股票第 iii 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算 ...

  4. 【算法】贪心算法:LeetCode 714 买卖股票的最佳时机含手续费 、LeetCode 968 监控二叉树

    LeetCode 714 买卖股票的最佳时机含手续费 (中等) 题目 描述 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你 ...

  5. 美团外卖疑似割会员韭菜,“大数据杀熟”再次被拉上台面

    近日,<我被美团会员割了韭菜>一文刷爆朋友圈,引发媒体关注.该文作者"漂移神父"控诉美团外卖专割会员韭菜.对此,美团回应称预估配送费差异与会员身份无关,是定位缓存偏差导 ...

  6. 【贪心算法】Leetcode 714. 买卖股票的最佳时机含手续费

    [贪心算法]Leetcode 714. 买卖股票的最佳时机含手续费 题目 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. ...

  7. 交友相亲类软件是如何割你韭菜的

    今天讲一下交友APP的逻辑,你就会发现你就是交友APP的韭菜,尤其是男生们,无处不在被割,这里利用了心理学,产品是怎么做的呢? 首先你会在某些平台看到交友APP的广告,广告封面往往是配的好看的小姐姐的 ...

  8. 我来泼盆冷水:正面迎击AI的时代千万别被ChatGPT割了韭菜

    前言 ChatGPT从出来的时候我就一直密切关注,为此还加了不少群,用了不少套壳的程序,公司还开了专门的培训会,技术团队还为此搭建了接入ChatGPT的服务,帮助全公司的产品.商务.测试.运维.研发一 ...

  9. PM mi 小米上市会割多少韭菜?

    mi 小米上市会割多少韭菜 ?点点有戏 图片来自互联网

最新文章

  1. 线程同步 生产者消费者 java_Java线程同步:生产者-消费者 模型(代码示例)
  2. 鼠标滚轮控制panel滚动条
  3. poj1426(dfs)
  4. pytorch慢到无法安装,该怎么办?
  5. OpenCV3 Java 机器学习使用方法汇总
  6. SQL游标使用方法SQL游标使用方法(转)
  7. linux多线程_Java+Linux,深入内核源码讲解多线程之进程
  8. Qt:Windows编程—Qt实现本地服务管理
  9. Ubuntu配置java环境
  10. windows安装hbase
  11. zblog自动采集伪原创站群文章更新器
  12. web学习(3)--别踩白块儿(HTML版)(web入门)
  13. 怎么把柱形图和折线图放在一起_Excel图表制作:柱形图和折线图的组合图案例...
  14. 关于Cat,同轴,光纤等以太网电缆的所有信息
  15. 嵌入式Linux开发8——UART串口通讯
  16. EM and Variational Inference Derivation
  17. 混频锁相环相关拓扑,性能以及错锁问题梳理
  18. 【专业数据】二.2020~2022年北京交通大学【信息与通信工程】专业复试线/分数线差/计划招生数/复试数/录取数/复试比例/录取率
  19. Shader学习3——半兰伯特
  20. MTS格式视频转AVI相关软件

热门文章

  1. 笑傻了,2016最新爆笑笑话
  2. 一个因为英语培训改变人生的真实案例
  3. php代码符号用键盘怎么敲的,教你用键盘打出一些特殊符号
  4. 网易游戏2015年暑期实习生面试经历-游戏研发工程师
  5. QQ在线状态自定义图片风格
  6. ARM Neon并行加速第一课
  7. 【校招VIP】“推推”项目课程Java:SpringBoot demo的说明、入门和下载
  8. 新浪微博新版公测 私信支持文件图片发送(图)
  9. 家庭辈分计算机,辈分
  10. python把视频取帧_用Python提取视频帧