当前位置: 首页 > news >正文

leetcode hot100 买卖股票最佳时机3

在这里插入图片描述
本题中,依旧可以采用动态规划来进行解决,之前的两个题我们都是用二维数组dp[i][2]来表示的,其中i表示第i天,2表示长度为2,其中0表示不持有,1表示持有。
本题中,说至多完成两笔交易,也就是说我们可以买卖1次或者两次,然后获取价格最大的交易即可。所以说我们也还是要区分状态,只不过这次状态需要区分第一次第二次。

dp[i][0]表示不操作,dp[i][1]表示在第i天第一次持有,dp[i][2]表示在第i天第一次不持有,dp[i][3]表示第i天第二次持有,dp[i][4]表示在第i天第二次不持有。

所以 递推公式如下
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]);

dp[i][1]表示第i天第一次持有,可能是前一天就已经持有了,也可能是前一天没持有,然后当天第1次买入(第一次买入所以是-prices[i])。
dp[i][2]表示第i天第一次不持有,可能是前一天就已经不持有了,也可能是前一天持有,然后第i天卖出了。
dp[i][3]表示第i天第二次持有,可能是前一天就已经是第二次持有了,也可能前一天第1次不持有,然后第i天买入
dp[i][4]表示第i天第二次不持有,可能是前一天就第二次不持有了,也可能是前一天第二次持有,然后第i天卖出。

初始化:
dp[0][0]表示第0天没有操作,所以是0
dp[0][1]表示第0天,第一次持有,是-prices[0]
dp[0][2]表示第0天,第一次不持有,则是当天买然后当天卖 所以是0
dp[0][3]表示第0天,第二次持有,也就是第一次买完然后卖掉,再买,就是-prices[0]
dp[0][4]表示第0天,第二次不持有,就是第一次买完卖掉,当天再买再卖,所以是0

遍历顺序:
由前一天推出后一天的状态,所以应该是从前往后遍历

打印数组:我们最后打印的,一定是卖出股票的钱,所以就是dp[len-1][2]和dp[len-1][4]的最大值。

// 版本一
class Solution {public int maxProfit(int[] prices) {int len = prices.length;// 边界判断, 题目中 length >= 1, 所以可省去if (prices.length == 0) return 0;/** 定义 5 种状态:* 0: 没有操作, 1: 第一次买入, 2: 第一次卖出, 3: 第二次买入, 4: 第二次卖出*/int[][] dp = new int[len][5];dp[0][1] = -prices[0];// 初始化第二次买入的状态是确保 最后结果是最多两次买卖的最大利润dp[0][3] = -prices[0];for (int i = 1; i < len; i++) {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]);}return dp[len - 1][4];}
}

相关文章:

  • 4.4 MySQL存储
  • Springboot集成Druid实现监控功能
  • 【力扣hot100】刷题笔记Day13
  • BlackberryQ10 是可以安装 Android 4.3 应用的,Web UserAgent 版本信息
  • React歌词滚动效果(跟随音乐播放时间滚动)
  • LeetCode刷题笔记之回溯算法(一)
  • 从ChatGPT到Sora,来了解大模型训练中的存储
  • 记录 | docker内修改host方法
  • Android14之input高级调试技巧(一百八十八)
  • C++ 学习之函数对象
  • Stable Diffusion 绘画入门教程(webui)-ControlNet(深度Depth)
  • Day13-Linux系统用户管理知识精讲2
  • Java架构师之路六、高并发与性能优化:高并发编程、性能调优、线程池、NIO、Netty、高性能数据库等。
  • Movelt使用笔记-Movelt Setup Assistant
  • C# OpenCvSharp Tracker 目标追踪
  • css系列之关于字体的事
  • django开发-定时任务的使用
  • Git 使用集
  • JavaScript对象详解
  • leetcode388. Longest Absolute File Path
  • maven工程打包jar以及java jar命令的classpath使用
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • PHP的类修饰符与访问修饰符
  • Python3爬取英雄联盟英雄皮肤大图
  • scala基础语法(二)
  • sessionStorage和localStorage
  • SpringBoot几种定时任务的实现方式
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 温故知新之javascript面向对象
  • 昨天1024程序员节,我故意写了个死循环~
  • ![CDATA[ ]] 是什么东东
  • $.ajax()方法详解
  • ${ }的特别功能
  • (2)STM32单片机上位机
  • (a /b)*c的值
  • (arch)linux 转换文件编码格式
  • (pojstep1.3.1)1017(构造法模拟)
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (实战篇)如何缓存数据
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)负载均衡,回话保持,cookie
  • (转)用.Net的File控件上传文件的解决方案
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET中的十进制浮点类型,徐汇区网站设计
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [.net]官方水晶报表的使用以演示下载
  • [<死锁专题>]
  • [Firefly-Linux] RK3568 pca9555芯片驱动详解
  • [linux time命令学习篇] time 统计命令执行的时间
  • [LOJ161] 仙人掌计数
  • [MySQL--进阶篇]存储引擎的体系结构、简介、特点、选择
  • [NOI2014]购票