Day42 力扣动态规划 :123.买卖股票的最佳时机III |188.买卖股票的最佳时机IV

Day42 力扣动态规划 :123.买卖股票的最佳时机III |188.买卖股票的最佳时机IV

  • 123.买卖股票的最佳时机III
    • 第一印象
    • 看完题解的思路
      • dp数组:
      • 递推公式:
      • 初始化
      • 遍历顺序
    • 实现中的困难
    • 感悟
    • 代码
  • 188.买卖股票的最佳时机IV
    • 第一印象
    • 初始化
    • 递推公式
    • 看完题解的思路
    • 实现中的困难
    • 感悟
    • 代码

123.买卖股票的最佳时机III

这道题一下子就难度上来了,关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。
视频讲解:https://www.bilibili.com/video/BV1WG411K7AR
https://programmercarl.com/0123.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIII.html

第一印象

这道题变成最多买卖两次:买卖0,1,2次都合理。

感觉挺难的,直接看题解吧。

看完题解的思路

分析一下题目里的状态,因为最多买入两次,所以有第一次的持有+不持有、第二次的持有+不持有。

在这里插入图片描述

但其实不操作这一种情况可以不管。

dp数组:

如上图所示

第 i 天在 0~4状态时,剩的最大金额是dp[i][0] ~ dp[i][4]

递推公式:

对于dp[i][1] ,第一次有股票

  • 延续前一天的第一次有股票状态:dp[i-1][1]
  • 这一天进行了买入才有股票: -price[i]

对于dp[i][2] ,第一次没有股票

  • 延续前一天的第一次没有股票的状态:dp[i-1][2]
  • 这一天进行了卖出才没有股票: dp[i-1][1] + price[i]

对于dp[i][3],第二次有股票

  • 延续前一天第二次有股票状态: dp[i-1][3]
  • 这一天进行了买入,才有股票:dp[i-1][2] - price[i]

对于dp[i][4],第二次没有股票

  • 延续了前一天第二次没有股票的状态:dp[i-1][4]
  • 这一天进行了卖出才没有股票:dp[i-1][3] + price[i]

每一次都选择更大的状态

初始化

dp[0][0] = 0
dp[0][1] = -price[I]
dp[0][2] = 0
dp[0][3] = -price[I]
dp[0][4] = 0

看做第一天买入卖出,又买入卖出

遍历顺序

正序遍历就行

实现中的困难

代码上不难

感悟

这道题我觉得难于思考的有两个地方:

  • 五种状态如何转移,在看完题解的思路那说得很清楚了
  • 如何理解初始化:第一次买卖好理解,但是第二次再买卖不怎么好理解

第二种的问题也直接导致了,这道题其实可以只买一次。**那么最后如何理解,只需要直接return dp[length][4] 。**因为它包含了买两次的,也包含了只买一次的情况。

我们手写一个只买一次的情况

在这里插入图片描述

我们会发现,每一天第一次卖出的情况是在不断更新的,第二次卖出和第一次卖出的数值也是一样的。

我觉得可能是因为初始化的时候,第二次买卖的状态就是当天买当天卖。之后这个状态一直持续在表格里。

比如2-2的位置代表,第一天买第三天卖出有最多收益,2-4的含义也是第一天买第三天卖出有最多的收益。

我认为, 它们是重复的,所以可以看作2-4 就是 2-2的当天再次买卖的情况,但本质上他们是重复的。

这里画出一个两次买卖的图就更能清晰的对比了,明白第二次买卖是怎么变的和第一次不一样的,但我懒了。

上课去咯

代码

class Solution {public int maxProfit(int[] prices) {int[][] dp = new int[prices.length][5];dp[0][0] = 0;dp[0][1] = - prices[0];dp[0][2] = 0;dp[0][3] = - prices[0];dp[0][4] = 0;for (int i = 1; i < prices.length; i++) {dp[i][0] = dp[i - 1][0];dp[i][1] = Math.max(dp[i - 1][1], - prices[i]);dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i]);dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]);dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]);}for (int i = 0; i < dp.length; i++) {for (int j = 0; j < 5; j++) {System.out.print(dp[i][j] + "  ");}System.out.println();}return dp[prices.length - 1][4];}
}

188.买卖股票的最佳时机IV

本题是123.买卖股票的最佳时机III 的进阶版
视频讲解:https://www.bilibili.com/video/BV16M411U7XJ
https://programmercarl.com/0188.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIV.html

第一印象

我觉得我行

上一道题是最多 2 次买卖,就对应 第一次有、没有 + 第二次有、没有四种状态。

那么k次买卖,就对应第一次有、没有……第k次有、没有

也就是数组大小从 4 变成 2*k

然后按之前的套路去取最大值就行了。

初始化

初始化的时候有点小麻烦,因为每一次有两种状态,所以 for 循环要以 两种状态 为一次去做。就是 j += 2 而不是 j++

递推公式

递推公式也是,for 循环要以 两种状态 为一次去做。就是 j += 2 而不是 j++

这个地方需要注意!!!
对于 j = 0 的情况,如果在 i 天,计算第一次拥有的最大钱。应该是比较 i - 1天就第一次拥有的金额 和 在这一天进行第一买入的 -price[i]

因为第一次买入,不需要依赖上一天卖出的价格。

如果是计算 i 天,第三次拥有的最大钱。就是比较 i -1天就第三次拥有的金额 和 在这一天进行第三次买入的 dp[i-1][3] - price[i]

看完题解的思路

和我写的类似,他保留了 不操作 的那个状态。

实现中的困难

没有处理 j = 0的情况,就是在递推公式那里我提到的。

感悟

感觉股票问题很套路

代码

class Solution {public int maxProfit(int k, int[] prices) {//dp数组int[][] dp = new int[prices.length][2 * k];//初始化for (int j = 0; j < 2 * k; j += 2) {dp[0][j] = -prices[0];dp[0][j + 1] = 0;}//状态转移 //对于每一天来说for (int i = 1; i < prices.length; i++) {//第 j 次有股票和第j次没股票for (int j = 0; j < 2 * k; j += 2) {//第一次if (j == 0) {//昨天就有了,今天是第一次有,所以是-price[i]dp[i][j] = Math.max(dp[i - 1][j], - prices[i]);//昨天就没有、今天才没有dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] + prices[i]);} else {//昨天就有了、今天才有dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);//昨天就没有、今天才没有dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] + prices[i]);}}}return dp[prices.length - 1][2 * k - 1];}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/156296.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法通过村第十八关-回溯|青铜笔记|什么叫回溯(后篇)

文章目录 前言回溯热身问题输出二叉树的所有路径&#xff1a;路径总和问题&#xff1a; 总结 前言 提示&#xff1a;今夜思量千条路&#xff0c;明朝依旧卖豆腐。 --谚语 回溯是非常重要的算法思想之一&#xff0c;主要解决一些暴力枚举也搞不定的问题&#xff08;这里埋个坑&a…

汽车配件商城小程序制作 | 汽车配件售卖,高门槛但高利润

通过汽车配件商城小程序给别人的供货&#xff0c;利润可高达60%&#xff0c;但甚少有人关注汽车配件销售的行业。具体情况是怎么样的呢&#xff0c;下面给大家简单分析。 据数据显示&#xff0c;国内有4亿多辆汽车&#xff0c;这些汽车坏了要修&#xff0c;也要偶尔进行保养&am…

集成测试、单元测试、系统测试之间的关系和区别

前言 为了使软件正常工作&#xff0c;所有单元都应集成在一起并正常运行。集成测试就像是要求不同工种的工人修建一个房子&#xff0c;希望他们都团结协作。如何判断他们在一起是否可以按照计划完成建设呢&#xff1f;唯一了解的方法是通过将它们全部拉在一起并测试它们如何相互…

正则表达式续篇

位置锚定&#xff1a; ^:行首锚定&#xff0c;表示以什么为开头 例如&#xff1a; $:行尾锚定&#xff0c;表示以什么为结尾 例如&#xff1a; ^&#xff1a;匹配的是空行 例如&#xff1a; ^root$&#xff1a;匹配整行&#xff0c;而且整行只能有这一个字符串 实验&#x…

百度地图直接用的封装好的--自用vue的(每次项目都要有百度地图,还是搞个封装的差不多的以后可以直接拿来用)

自用的封装好的,有弹窗,轨迹回放,画点画地图 完整代码使用 百度地图的官方文档 百度地图必须的三个引用 完整代码 <template><AButton style"background-color: #3ba7ea;color: white;width: 100px;float: right" click"buttonClick">轨迹回放…

chatgpt接口调用

在线接口文档&#xff1a; https://app.apifox.com/invite?tokensymrLP7sojF6N31kZqnpZ 接口地址 https://chat.xutongbao.top/api/light/chat/createChatCompletion 请求方式 POST 请求参数 token String, 必须 prompt Array, 必须 例子一&#xff1a; 包含上下文 [ { "…

报修软件有什么用?企业如何做好设备管理与维护?

在当今的商业环境中&#xff0c;设备设施的维护和管理已经成为企业运营的重要环节。无论是学校、酒店、物业等大型企事业单位&#xff0c;还是运维集成商、制造工厂等企业单位&#xff0c;都需要对设备设施进行有效的管理。报修软件作为一种智能化的解决方案&#xff0c;为设备…

codeMirror代码编辑器,如何定位并在编辑区域输入内容

背景 最近在写UI自动化&#xff0c;发现普通的方法不能在CodeMirror编辑器里面输入内容&#xff0c;只能通过JS的方式输入内容。 于是琢磨了一下selenium和playwright这2种自动化工具&#xff0c;在CodeMirror编辑器里面输入内容的差别。 注意&#xff1a;这里在定位CodeMirr…

人脸检索 M:N(视频,摄像头),调用百度API

目录 创建百度智能云账号 代码部分&#xff1a; 创建百度智能云账号 网址&#xff1a; 百度智能云-云智一体深入产业 点击导航栏中的产品&#xff0c;再选择人脸与人体 再选择人脸搜索 进入后&#xff0c;可以先去领取免费资源&#xff0c;如果不领取&#xff0c;后面是无法…

如何快速绘制网络拓扑图

关于网络拓扑 网络拓扑能直观明了的展示网络中各网元之间的关系&#xff0c;极大方便运维人员对网络进行实时监测、优化配置、故障排查等操作。 传统采用Visiot或PowerPoint的方式存在耗时耗力且无法实现动态更新&#xff0c;维护及使用成本高&#xff1b;可展现的内容有限&a…

小红书穿搭类种草营销怎么做?纯干货

在众多营销方式中&#xff0c;穿搭类种草营销以其独特的优势在小红书平台上崭露头角。穿搭类种草营销&#xff0c;以其独特的优势&#xff0c;成为了品牌和商家推广产品的重要方式。其优势主要体现在以下几个方面&#xff1a; 1. 高度相关性&#xff1a;小红书平台的用户主要是…

【Cargo Therapeutics】申请1亿美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;美国生物制药公司【Cargo Therapeutics】近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为(CRGX),Cargo Therapeutics…