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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

【git】关于git二三事

文章目录 前言一、创建版本库1.通过命令 git init 把这个目录变成git可以管理的仓库2.将修改的内容添加到版本库2.1 git add .2.2 git commit -m "Xxxx"2.3 git status 2.4 git diff readme.txt3.版本回退3.1 git log3.2 git reset --hard HEAD^ 二、理解工作区与暂存…

操作系统内部机制学习

切换线程时需要保存什么 函数需要保存吗&#xff1f;函数在Flash上&#xff0c;不会被破坏&#xff0c;无需保存。函数执行到了哪里&#xff1f;需要保存吗&#xff1f;需要保存。全局变量需要保存吗&#xff1f;全局变量在内存上&#xff0c;无需保存。局部变量需要保存吗&am…

Leetcode—337.打家劫舍III【中等】

2023每日刷题&#xff08;五十二&#xff09; Leetcode—337.打家劫舍III 算法思想 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(null…

I.MX6ULL_Linux_驱动篇(46)linux LCD驱动

LCD 是很常用的一个外设&#xff0c;在Linux 下LCD 的使用更加广泛&#xff0c;在搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。本章我们就来学习一下如何在 Linux 下驱动 LCD 屏幕。 Linux 下 LCD 驱动简析 Framebuffer 设备 先来回顾一下裸机的时候 LCD 驱动是怎…

前端入门:HTML初级指南,网页的简单实现!

代码部分&#xff1a; <!DOCTYPE html> <!-- 上方为DOCTYPE声明&#xff0c;指定文档类型为HTML --> <html lang"en"> <!-- html标签为整个页面的根元素 --> <head> <!-- title标签用于定义文档标题 --> <title>初始HT…

单点登录方案调研与实现

作用 在一个系统登录后&#xff0c;其他系统也能共享该登录状态&#xff0c;无需重新登录。 演进 cookie → session → token →单点登录 Cookie 可以实现浏览器和服务器状态的记录&#xff0c;但Cookie会出现存储体积过大和可以在前后端修改的问题 Session 为了解决Co…

UVM建造测试用例

&#xff08;1&#xff09;加入base_test 在一个实际应用的UVM验证平台中&#xff0c;my_env并不是树根&#xff0c;通常来说&#xff0c;树根是一个基于uvm_test派生的类。真正的测试用例都是基于base_test派生的一个类。 class base_test extends uvm_test;my_env e…

14-2(C++11)类型推导、类型计算

14-2&#xff08;C11&#xff09;类型推导、类型计算 类型推导auto关键字auto类型推断本质auto与引用 联用auto关键字的使用限制 类型计算类型计算分类与类型推导相比四种类型计算的规则返回值后置 类型推导 auto关键字 C98中&#xff0c;auto表示栈变量&#xff0c;通常省略…

Leetcode刷题笔记题解(C++):25. K 个一组翻转链表

思路&#xff1a;利用栈的特性&#xff0c;K个节点压入栈中依次弹出组成新的链表&#xff0c;不够K个节点则保持不变 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …

在国内,现在月薪1万是什么水平?

看到网友发帖问&#xff1a;现在月薪1W是什么水平&#xff1f; 在现如今的情况下&#xff0c;似乎月薪过万这个标准已经成为衡量个人能力的一个标准了&#xff0c;尤其是现在互联网横行的时代&#xff0c;好像年入百万&#xff0c;年入千万就应该是属于大众的平均水平。 我不是…

kafka入门(四):消费者

消费者 (Consumer ) 消费者 订阅 Kafka 中的主题 (Topic) &#xff0c;并 拉取消息。 消费者群组&#xff08; Consumer Group&#xff09; 每一个消费者都有一个对应的 消费者群组。 一个群组里的消费者订阅的是同一个主题&#xff0c;每个消费者接收主题的一部分分区的消息…

大师学SwiftUI第18章Part2 - 存储图片和自定义相机

存储图片 在前面的示例中&#xff0c;我们在屏幕上展示了图片&#xff0c;但也可以将其存储到文件或数据库中。另外有时使用相机将照片存储到设备的相册薄里会很有用&#xff0c;这样可供其它应用访问。UIKit框架提供了如下两个保存图片和视频的函数。 UIImageWriteToSavedPh…

JAVA后端自学技能实操合集

JAVA后端自学技能实操 内容将会持续更新中,有需要添加什么内容可以再评论区留言,大家一起学习FastDFS使用docker安装FastDFS(linux)集成到springboot项目中 内容将会持续更新中,有需要添加什么内容可以再评论区留言,大家一起学习 FastDFS 组名&#xff1a;文件上传后所在的 st…

leetcode 100.相同的树

涉及到递归&#xff0c;最好多画图理解&#xff0c;希望对你们有帮助 100.相同的树 题目 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 题目链接…

GPIO的使用--滴答定时器--pir人体红外传感器

目录 一、滴答定时器的使用与原理 1、定义 2、原理 &#xff08;1&#xff09;向上计数​编辑 &#xff08;2&#xff09;向下计数 &#xff08;3&#xff09; 代码流程 a、配置滴答时钟唤醒频率 b、滴答时钟中断函数 &#xff08;4&#xff09;结果 3、优化-->寄存…

读书笔记-《数据结构与算法》-摘要4[插入排序]

插入排序 核心&#xff1a;通过构建有序序列&#xff0c;对于未排序序列&#xff0c;在已排序序列中从后向前扫描(对于单向链表则只能从前往后遍历)&#xff0c;找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间) 从第一个元素开始&#xff0c;该元素可…

如何主持一场知识竞赛抢答赛

知识竞赛主持说难不难&#xff0c;说简单也不简单&#xff0c;我就从易到难介绍一下。 入门级&#xff0c;题主不用练习太多其他花哨的技巧&#xff0c;只要注意一点&#xff0c;熟悉比赛流程。知识竞赛需要给所有选手一个公平流畅的答题环境&#xff0c;所以题主自身必须非常…

干货!接口中的大事务,该如何进行优化?

作为后端开发的程序员&#xff0c;我们常常会的一些相对比较复杂的逻辑&#xff0c;比如我们需要给前端写一个调用的接口&#xff0c;这个接口需要进行相对比较复杂的业务逻辑操作&#xff0c;比如会进行&#xff0c;查询、远程接口或本地接口调用、更新、插入、计算等一些逻辑…

掌握iText:轻松处理PDF文档-进阶篇

简体中文写入 iText本身对简体中文的支持有限&#xff0c;但可以通过引入额外的字体包来增强其对简体中文的支持。例如&#xff0c;可以使用iTextAsian.jar这个亚洲字体包&#xff0c;它包含了几种简单的亚洲字体&#xff0c;其中包括简体中文字体。只需要将iTextAsian.jar放到…

46. 全排列

46. 全排列 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;_46全排列_构建数组回溯_46全排列_直接构建 错误经验吸取 原题链接&#xff1a; 46. 全排列 https://leetcode.cn/problems/permutations/description/ 完成情况&#xff1a;…