力扣122.-买卖股票的最佳时机 II(Java详细题解)

server/2024/9/25 10:34:52/

题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)

前情提要:

本题是由121. 买卖股票的最佳时机 - 力扣(LeetCode)变形而来,121是只能买卖一次股票,该题是可以买卖多次股票,我相信当你做完这道题或者看完我上道题的题解,力扣121-买卖股票的最佳时机(Java详细题解)-CSDN博客

那么写这道题会轻松很多。

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

该题唯一的区别就是与121买卖股票的次数不同,该题是可以买卖多次股票,所以我们就对递推公式进行修改即可。就不用dp五部曲分析了。

121的递推公式如下:

下标为i天持股手上的最大现金的状态可以由俩个状态推出。

我当天持股可能我前一天也是持股的状态,也可能是我当天买入股票的状态。

dp[i] [0] = Math.max(dp[i - 1] [0],-prices[i]);

dp[i] [1] = Math.max(dp[i - 1] [1],dp[i - 1] [0] + prices[i]);

下标为i天不持股手上的最大现金的状态也可以由俩个状态推出。

我当天不持股可能我前一天也是不持股的状态,也可能是我当天卖出股票的状态。

我当天卖出,那我的前一天肯定是持股的状态,那我就将前一天持股手上的最大现金加上我当天卖出的股票最大现金,也就是我的最大不持股的现金(所得的利润)。

由于只能买卖一次,所以我在当天买入股票的状态肯定是 0 - prices[i];

但是该题可以买卖多次,那我买入股票的时候可能前面已经进行过一次买卖了,那我手上的现金就不是0了,就为上一次买卖后所得的最大现金。

那我第二次再买股票的时候,我就要将上一次买卖后所得的最大现金减去当前买入股票的价格即可。

那买卖多次也同理。

所以该题的递推公式就为:

p[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] [0] + prices[i]);

dp[i - 1] [1]就是指上一次不持股手上的最大现金。也就是可能是上一次买卖后所得的最大现金。

其他与121无异。

最终代码:

java">class Solution {public int maxProfit(int[] prices) {//买卖股票一次和多次的区别在于持股的状态公式,因为之前买卖一次的时候,我在买股票之前的现金为0,所以持股时期就是为0 - prices[i]//而现在可以买入多次,可能我这次手头的现金已经是上次买卖完股票后所得的最大现金了 所以这次我所得的买股的状态转换方程为//第i天之前已经持股 那就是dp[i - 1][0]//如果是当天买入的股票 就是dp[i - 1][1] - prices[i]int [][] dp = new int [prices.length + 1][2];dp[0][0] = -prices[0];dp[0][1] = 0;for(int i = 1;i < prices.length;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][0] + prices[i]);}//最后一天的不持股(没有股票,可能在最后一天之前就已经卖了)得到的现金因为递推公式,被前面最大的卖出股票的价格所覆盖了,所以获得的最大利润就为dp[prices.length - 1][1]//在本题持股的最大现金一定为负数,所以得的最大值就是不持股的最大现金return dp[prices.length - 1][1];}
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!


http://www.ppmy.cn/server/118925.html

相关文章

TESSY创建以及设计一个测试用例

我们以tessy5.1 IDE为例&#xff0c;给大家展示编写一个测试用例的过程。 还不会创建工程的&#xff0c;可以参考以下这篇文章&#xff1a; TESSY创建单元测试或集成测试工程_tessy 集成测试-CSDN博客 接下来我们以这个作为开始状态进行介绍 1、添加源文件 2、添加头文件路径…

HarmonyOS开发5.0【骨架屏】 app界面制作

实现原理 1.定义组件和状态变量&#xff1a; 使用 Entry 和 Component 装饰器定义了一个名为 IvSkeleton 的组件。 定义了一个状态变量 translageX&#xff0c;初始值为 -100%&#xff0c;用于控制闪电效果的位置。 定义了两个数值变量 widthValue 和 heightValue&#xff0c;…

JVM相关

1.JVM内存区域 一个运行起来的java进程就是一个Java虚拟机&#xff0c;就需要从操作系统中申请一大块内存。 内存中会根据作用的不同被划分成不同的区域&#xff1a; &#xff08;1&#xff09;栈&#xff1a;存储的内容是代码在执行过程中&#xff0c;方法之间的调用关系&a…

2024年9月HarmonyOS鸿蒙应用开发者高级认证全新题库(覆盖99%考题)

一个小时通过鸿蒙高级认证 1、在开发 Harmony0S 应用工程时&#xff0c; 随着业务的发展&#xff0c;现在需要创建一个模块&#xff0c; 关于在 DevEco Studio 中创建 Module &#xff0c; 下列选项哪种方式是错误的? 必对 在 hvigor 目录下&#xff0c;单击鼠标右键&#xf…

保护您的企业免受网络犯罪分子侵害的四个技巧

在这个日益数字化的时代&#xff0c;小型企业越来越容易受到网络犯罪的威胁。网络犯罪分子不断调整策略&#xff0c;并使用人工智能来推动攻击。随着技术的进步&#xff0c;您的敏感数据面临的风险也在增加。 风险的不断增大意味着&#xff0c;做好基本工作比以往任何时候都更…

面试—MySQL

目录 多表查询 事务 存储引擎 索引结构 索引分类 SQL性能优化 索引失效 视图 存储过程 触发器 MySQL锁 全局锁 表锁 行锁 多表查询 分类 内连接 只返回两个表符合条件的数据&#xff0c;相关联的数据&#xff08;两个表的交集&#xff09; 外连接 左外连接以左…

vscode搭建ros开发环境问题记录(更新...)

文章目录 vscode 不能自动补全方法一&#xff1a;方法二&#xff1a; 开发环境&#xff1a; vmware 15.7 ubuntu 20.04 ros noetic vscode 不能自动补全 方法一&#xff1a; 这里将头文件已经正确包含到c_cpp_properties.json中代码中仍然不能自动补全&#xff0c; 将C_CPP插…

Spring01

spring框架 spring是轻量级的容器框架 spring framework 1、Spring核心学习内容 IOC、AOp, jdbcTemplate,声明式事务 2、IOC:控制反转&#xff0c;孚以管理部8号对象 3.AOP:切面编程4.JDBCTemplate:是spring提供一套访问数据库的技术,应用性强&#xff0c;相对好理解5.声明式…