leetcode 股票DP系列 总结篇
121. 买卖股票的最佳时机
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。
只能进行一次交易
很简单,只需边遍历边记录最小值即可。
class Solution {
public:int maxProfit(vector<int>& prices) {int res = 0;for (int i = 0, minp = INT_MAX; i < prices.size(); i ++ ) {res = max(res, prices[i] - minp);minp = min(minp, prices[i]);}return res;}
};
122. 买卖股票的最佳时机 II
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
不限制交易次数
class Solution {public int maxProfit(int[] prices) {
//不论如何交易都等价于连续进行单天买入卖出的交易
//pi-pj=pi-pk+pk-pj
//只加正数天即可int res=0;for(int i=0;i+1<prices.length;i++){res+=Math.max(0,prices[i+1]-prices[i]);}return res;}
}
123. 买卖股票的最佳时机 III
你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
限制交易次数
任何时候最多一次只能持有一只股票
思路一:
前后缀分解, 枚举第二次交易买入的时间
前半段就是1~ i - 1天只进行一次交易的最大收益(预处理出来一个f数组,实际上就是121题)
想要提前知道什么东西只能预处理,或者贪心(猜),或者二分,先猜想答案再去验证
右边就是 maxRight - i
class Solution {public int maxProfit(int[] prices) {int n=prices.length;int[] f=new int[n];int leftMin=prices[0];f[0]=0;//f[i] [0,i]天进行一次交易的最大值for(int i=1;i<n;i++){f[i]=Math.max(f[i-1],prices[i]-leftMin);leftMin=Math.min(leftMin,prices[i]); }int res=0;int rightMax=prices[n-1];for(int i=n-1;i>=0;i--){//最右的特殊情况是只做一次交易,只有前缀if(i!=0)//注: 这里为什么不改成Math.max(rightMax - prices[i], 0);//因为假如有半部分这个值<0了,也就只是说明f[i - 1]会失效,//i.e. f[i - 1]加了个负数//也就是说我们没有考虑只采用f[i - 1]的情况,//但是这个情况已经包含最左,只有一个后缀,只进行一次交易的情况中了,也就是包含在res=Math.max(res,rightMax-prices[i]);中了res=Math.max(res,f[i-1]+rightMax-prices[i]);elseres=Math.max(res,rightMax-prices[i]);rightMax=Math.max(rightMax,prices[i]);}return res;}
}
另一种更通用的方法: 动态规划
以下的代码可能有点难理解,不如画成状态机
之后的总结建议看:
灵茶山艾府
class Solution {public int maxProfit(int[] prices) {int n = prices.length;int buy1 = -prices[0], sell1 = 0;int buy2 = -prices[0], sell2 = 0;for (int i = 1; i < n; ++i) {buy1 = Math.max(buy1, -prices[i]);sell1 = Math.max(sell1, buy1 + prices[i]);buy2 = Math.max(buy2, sell1 - prices[i]);sell2 = Math.max(sell2, buy2 + prices[i]);}return sell2;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/solutions/552695/mai-mai-gu-piao-de-zui-jia-shi-ji-iii-by-wrnt/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
188
至多k次交易
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

大雪菜
灵茶山做法可能更好记:
class Solution {public int maxProfit(int k, int[] prices) {int n = prices.length;int[][][] f = new int[n + 1][k + 2][2];for (int i = 0; i < n; i++) {for (int j = 0; j <= k + 1; j++) {Arrays.fill(f[i][j], Integer.MIN_VALUE / 2); // 防止溢出}}for (int j = 1; j <= k + 1; j++) {f[0][j][0] = 0;}for (int i = 0; i < n; i++) {for (int j = 1; j <= k + 1; j++) {f[i + 1][j][0] = Math.max(f[i][j][0], f[i][j][1] + prices[i]);f[i + 1][j][1] = Math.max(f[i][j][1], f[i][j - 1][0] - prices[i]);}}return f[n][k + 1][0];}
}作者:灵茶山艾府
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/solutions/2201488/shi-pin-jiao-ni-yi-bu-bu-si-kao-dong-tai-kksg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {public int maxProfit(int k, int[] prices) {int[][] f = new int[k + 2][2];for (int j = 1; j <= k + 1; j++) {f[j][1] = Integer.MIN_VALUE / 2; // 防止溢出}f[0][0] = Integer.MIN_VALUE / 2;for (int p : prices) {for (int j = k + 1; j > 0; j--) {f[j][0] = Math.max(f[j][0], f[j][1] + p);f[j][1] = Math.max(f[j][1], f[j - 1][0] - p);}}return f[k + 1][0];}
}作者:灵茶山艾府
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/solutions/2201488/shi-pin-jiao-ni-yi-bu-bu-si-kao-dong-tai-kksg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
309 最佳买卖股票时机含冷冻期
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意股票系列状态总是 f[i] 表示第 i 天结束之后的状态
这里的「处于冷冻期」指的是在第 i 天结束之后的状态。也就是说:如果第 i 天结束之后处于冷冻期,那么第 i+1天无法买入股票。
class Solution {public int maxProfit(int[] prices) {if (prices.length == 0) {return 0;}int n = prices.length;// f[i][0]: 手上持有股票的最大收益// f[i][1]: 手上不持有股票,并且处于冷冻期中的累计最大收益// f[i][2]: 手上不持有股票,并且不在冷冻期中的累计最大收益int[][] f = new int[n][3];f[0][0] = -prices[0];for (int i = 1; i < n; ++i) {f[i][0] = Math.max(f[i - 1][0], f[i - 1][2] - prices[i]);f[i][1] = f[i - 1][0] + prices[i];f[i][2] = Math.max(f[i - 1][1], f[i - 1][2]);}return Math.max(f[n - 1][1], f[n - 1][2]);}
}// 作者:力扣官方题解
// 链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/solutions/323509/zui-jia-mai-mai-gu-piao-shi-ji-han-leng-dong-qi-4/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
714. 买卖股票的最佳时机含手续费
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
类似122, 唯一的区别就在于本题有「手续费」而第 122 题没有。
灵茶山
class Solution {public int maxProfit(int[] prices, int fee) {int n = prices.length;int[][] dp = new int[n][2];dp[0][0] = 0;dp[0][1] = -prices[0];for (int i = 1; i < n; ++i) {dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee);dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);}return dp[n - 1][0];}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/solutions/524669/mai-mai-gu-piao-de-zui-jia-shi-ji-han-sh-rzlz/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {public int maxProfit(int[] prices, int fee) {int n = prices.length;int sell = 0, buy = -prices[0];for (int i = 1; i < n; ++i) {sell = Math.max(sell, buy + prices[i] - fee);buy = Math.max(buy, sell - prices[i]);}return sell;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/solutions/524669/mai-mai-gu-piao-de-zui-jia-shi-ji-han-sh-rzlz/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1911. 最大子序列交替和
https://leetcode.cn/problems/maximum-alternating-subsequence-sum/
class Solution {public long maxAlternatingSum(int[] nums) {// p[i] 结尾为正数的序列的最大和 p[i - 1], g[i - 1] + nums[i]// g[i] 结尾为负数的序列的最大和 int n = nums.length;long[] p =new long[2];long[] g = new long[2];p[0] = Integer.MIN_VALUE / 2;g[0] = 0;//初始的时候 第一个选择的数字必然是正数, 因此在开始循环之前结尾为负数的序列是合法的for(int i = 1; i <= n; i++) {//滚动数组小技巧p[i & 1] = Math.max(p[(i - 1) & 1], g[(i - 1) & 1] + nums[i - 1]);g[i & 1] = Math.max(g[(i - 1) & 1], p[(i - 1) & 1] - nums[i - 1]);}return p[n & 1];}
}
方法二
func maxAlternatingSum(nums []int) int64 {f := [2]int{0, math.MinInt64 / 2} // 除 2 防止计算时溢出for _, v := range nums {f = [2]int{max(f[0], f[1]-v), max(f[1], f[0]+v)}}return int64(f[1])
}func max(a, b int) int {if a > b {return a}return b
}作者:灵茶山艾府
链接:https://leetcode.cn/problems/maximum-alternating-subsequence-sum/solutions/846375/dong-tai-gui-hua-by-endlesscheng-d92a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章:
leetcode 股票DP系列 总结篇
121. 买卖股票的最佳时机 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。 只能进行一次交易 很简单,只需边遍历边记录最小值即可。 class Solution { public:int maxProfit(vector<int>& prices) {int res …...
深入理解Java虚拟机---对象的创建和内存异常溢出
深入理解Java虚拟机---对象的创建和内存异常溢出 对象的创建对象内存布局对象的访问定位内存溢出Java堆溢出虚拟机栈和本地方法栈溢出方法区和运行时常量池溢出本地直接内存溢出 对象的创建 Step1:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是…...
windows MYSQL解决中文乱码问题
1.首先确保你已经把mysql配置了环境变量 2.打开window终端 3.输入mysql -u root -p 4.输入密码,就是安装的时候设置的root超级管理员权限密码 5.输入: SHOW VARIABLES LIKE ‘character%’; 出现上图,说明就会出现中文乱码问题。 6.该怎么办…...
EasyRecovery2024免费永久版手机数据恢复软件
EasyRecovery2024是一款操作安全、用户可自主操作的数据恢复方案,它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢…...
2023/12/11 作业
1.思维导图 2.作业 成果: 第一个头文件 #ifndef TEST3GET_H #define TEST3GET_H #include <QWidget> #include<QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class test3get; } QT_END_NAMESPACE class test3get : public QWidget { Q_OBJE…...
【11】Qt Designer
目录 VSCode添加外部工具 QtDesigner PyUIC PyRCC 加载UI文件模板代码 QMainWindow QWidget 常用知识点 1. 修改标题图标 2. 图片资源管理 3. 图片按钮 4. 加载对话框 5. 动态加载Widget 6. 修改主题 其他注意事项 事件被多次触发 PyQt5提供了一个可视化图形工…...
【算法优选】 动态规划之路径问题——贰
文章目录 🎋前言🌲[下降最小路径和](https://leetcode.cn/problems/minimum-path-sum/)🚩题目描述🚩算法思路:🚩代码实现 🎍[最小路径和](https://leetcode.cn/problems/minimum-path-sum/)&…...
从视频中截取指定帧图片
前言: 我们在很多时候需要对视频文件进行分析,或者对视频产生缩略图。因此视频截取技术必不可少。 从本地文件中读取视频帧 导包 <dependency><groupId>org.jcodec</groupId><artifactId>jcodec</artifactId><versio…...
2023最新vue安装(npm,yarn,国内镜像,vue安装,vue导包)全套教程2023年12月最新
第一步(安装npm) 官网地址:https://nodejs.org/en/download windows安装yarn 详细教程_windows yarn-CSDN博客 第二步(yarn下载) windows 下需要下载msi文件 ,下载地址:https://yarnpkg.com/latest.msi npm install -g…...
性能测试基础
性能测试分类 客户端性能:测试APP自身的性能,例如CPU、内存消耗;web页面元素渲染速度 服务端性能:测试服务端项目程序的支持的并发、处理能力、响应时间等,主要通过接口来做性能测试 性能测试指标 并发 同时向服务…...
算法与数据结构--最短路径Dijkstra算法
题目: 算法与数据结构实验题 10.20 迷路 ★实验任务 学长经常迷路,现在他又遇到问题了,需要求救。 假设他有一张地图,上面有N个点,M条路,他现在在编号为S的地方,想要去编号为E的地方&#x…...
ASP.NET Core 8 在 Windows 上各种部署模型的性能测试
ASP.NET Core 8 在 Windows 上各种部署模型的性能测试 我们知道 Asp.net Core 在 windows 服务器上部署的方案有 4 种之多。这些部署方案对性能的影响一直以来都是靠经验。比如如果是部署在 IIS 下,那么 In Process 会比 Out Process 快;如果是 Self Hos…...
跨框架解决方案-Mitosis【Context】
Context Mitosis的context必须是: 在自己的文件中创建文件名必须以context.lite.ts结尾默认导出必须是一个返回context对象的函数 // simple.context.lite.ts import { createContext } from builder.io/mitosis;export default createContext({foo: bar,get foo…...
有哪些重要的项目是用 Python 开发的?
请访问 https://www.python.org/about/success 查看使用了 Python 的项目列表。 阅览 历次 Python 会议 的日程纪要可以看到许多不同公司和组织所做的贡献。 高水准的 Python 项目包括 Mailman 邮件列表管理器 和 Zope 应用服务器。 多个 Linux 发行版,其中最著名的…...
【计算机网络】应用层电子邮件协议
一、电子邮件系统架构 电子邮件是一个典型的异步通信系统,发送方从UA,也就是邮件客户端,通过应用层SMTP协议,传输层tcp协议,发送给发送方的邮件服务器,比如使用的是163邮箱,163提供的SMTP服务器…...
视频剪辑:视频转码实用技巧,批量将MP4转为MP3音频
随着数字媒体设备的普及,视频和音频文件已成为日常生活中的重要组成部分。有时,可能要将MP4视频文件转换为MP3音频文件,以提取其中的音频内容或者进行其他处理。这是耗费时间的任务,那要如何操作呢?本文详解云炫AI智剪…...
体系化学习运筹学基础算法的实践和总结
文章目录 引言目标设计目标实践文章汇总经验总结一则预告 引言 眨眼间已经12月了,眼看着2023年马上要过完了。 女朋友最近总说,工作以后感觉时间过的好快。事实上,我也是这么认为的。年纪越大,越会担心35岁危机的降临。所以&…...
【Java探索之旅】我与Java的初相识(一):Java的特性与优点及其发展史
🎥 屿小夏 : 个人主页 🔥个人专栏 : Java入门到精通 🌄 莫道桑榆晚,为霞尚满天! 文章目录 一. Java语言概述与优势1.1 Java的概述1.2 Java语言的优势 二. Java领域与发展史2.1 Java的使用领域2.…...
重写 AppiumService 类,添加默认启动参数,并实时显示启动日志
一、前置说明 在Appium的1.6.0版本中引入了AppiumService类,可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试,使用该类的实例执行关闭server时,并没有释放端口号,会导致第二次启动时失败。另外,使用该…...
[方法论]allocation 空间内容分配
区分度 typeanalysisrecognitionconclusion type - 阅读 - 理解- 背诵- 听课 看 听 思考- reproduce/ 默写/ 应用- 背- 想- 写analysis 理解 和 背 是不占用现实空间的,可以在脑内不断消化,可以飞配给没有空间的时间块。 阅读 和 写是占用现实空间的…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
