股票买卖题型 详解

股票买卖题型

买卖股票最佳时机

在这里插入图片描述

第一题贪心算法应该快很多 就 不讲 。 此类问题 思路大致一致

在这里插入图片描述

第二题也可用贪心做 ans =max(ans, ans+prices[i]-prices[i-1]);

分析: 共有两个属性值 , 未持有持有股票

定义 f[ i ] [ 2 ] f[ i ] [ 0 ]表示 第i 天 的未持有股票的最大收益 。 分为 卖股票 和 保持之前状态 ,所以
f [ i ] [ 0 ] = m a x ( f [ i − 1 ] [ 0 ] , f [ i − 1 ] [ 1 ] + p r i c e s [ i ] ) f[i][0] = max(f[i-1][0],f[i-1][1]+prices[i]) f[i][0]=max(f[i1][0],f[i1][1]+prices[i])
​ f[ i ] [ 1 ] 表示第 i 天 的 持有股票的最大收益。 分为购买股票和继续持有之前的股票,所以
f [ i ] [ 1 ] = m a x ( f [ i − 1 ] [ 1 ] , f [ i − 1 ] [ 0 ] − p r i c e s [ i ] ) f[i][1] = max(f[i-1][1],f[i-1][0]-prices[i]) f[i][1]=max(f[i1][1],f[i1][0]prices[i])

public  int maxProfit(int[] prices) {int n = prices.length;if(n < 2 ) return 0;int f[][]= new int[n+1][2];f[0][0] = 0;f[0][1] = -prices[0];for(int i  =1 ;  i < n ; ++i){f[i][0] = Math.max(f[i-1][0],f[i-1][1]+prices[i]);f[i][1] = Math.max(f[i-1][1],f[i-1][0]-prices[i]);}return f[n-1][0];}

优化: 发现 f[i] [0] || f[i] [1] 仅和前一天的 状态有关,因此用滚动数组进行优化

定义一个最小花费ans[1] 替代 f[ i ] [ 1 ] , ans[0] 替代f[ i ] [ 0 ]

public  int maxProfit(int[] prices) {int n = prices.length;int f[]= new int[2];f[0] = 0;f[1] = -prices[0];for(int i  = 1 ;  i < n ; ++i){f[0] = Math.max(f[0],f[1]+prices[i]);f[1] = Math.max(f[1],f[0]-prices[i]);}return f[0];}

当进行限制交易次数:

在这里插入图片描述

沿用之前分析思路:

再增加一个维度第k次交易 即:f[ i ] [ 0|1 ] [ 0 | 1 ]

状态转移方程:

第一次交易未持有股票时最大收益:
f [ i ] [ 0 ] [ 0 ] = m a x ( f [ i − 1 ] [ 0 ] [ 0 ] , f [ i − 1 ] [ 1 ] [ 0 ] + p r i c e s [ i ] ) f[i][0][0] = max(f[i-1][0][0] , f[i-1][1][0]+prices[i]) f[i][0][0]=max(f[i1][0][0],f[i1][1][0]+prices[i])
第一次交易持有股票时最大收益(因为第一笔交易和第二笔交易不能同时进行,所以只需要记录第一次交易的购买最小值 在进行计算收益即可):
f [ i ] [ 1 ] [ 0 ] = m a x ( f [ i − 1 ] [ 1 ] [ 0 ] , − p r i c e s [ i ] ) f[i][1][0] = max(f[i-1][1][0],-prices[i]) f[i][1][0]=max(f[i1][1][0],prices[i])
第二次交易未持有股票时最大收益:
f [ i ] [ 0 ] [ 1 ] = m a x ( f [ i − 1 ] [ 0 ] [ 1 ] , f [ i − 1 ] [ 1 ] [ 1 ] + p r i c e s [ i ] ) f[i][0][1] = max(f[i-1][0][1],f[i-1][1][1]+prices[i]) f[i][0][1]=max(f[i1][0][1],f[i1][1][1]+prices[i])
第一次交易持有股票时最大收益:
f [ i ] [ 1 ] [ 1 ] = m a x ( f [ i − 1 ] [ 1 ] [ 1 ] , f [ i − 1 ] [ 0 ] [ 0 ] − p r i c e s [ i ] ) f[i][1][1] = max(f[i-1][1][1],f[i-1][0][0]-prices[i]) f[i][1][1]=max(f[i1][1][1],f[i1][0][0]prices[i])

public int maxProfit(int[] prices) {int n = prices.length;int[][][] f = new int[n][2][2];f[0][1][0] = -prices[0];f[0][1][1] = -prices[0];for (int i = 1; i < n; ++i) {f[i][0][0] = Math.max(f[i-1][0][0],f[i-1][1][0]+prices[i]);f[i][1][0] = Math.max(f[i-1][1][0],-prices[i]);f[i][0][1] = Math.max(f[i-1][0][1],f[i-1][1][1]+prices[i]);f[i][1][1] = Math.max(f[i-1][1][1],f[i-1][0][0]-prices[i]);}return f[n-1][0][1];}

优化: 可以发现第i天的状态只与第i-1天的状态有关,因此可以考虑使用滚动数组进行优化空间

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;}

在这里插入图片描述

分析: 与第三题相似,只不过再将交易维度从2变成了k维;

以下直接给出优化后的代码:

public int maxProfit(int k, int[] prices) {if(prices.length == 0 || k == 0) return 0;int dp[] = new int[k*2];for(int i = 0 ; i < 2*k ;i+=2){dp[i] = 0;dp[i+1] = -prices[0];}// 每一次的 持有股票定义为 m%2== 1 , 未持有则为 m%2==0for(int i = 1;  i < prices.length;++i){dp[0] = Math.max(dp[0],dp[1]+prices[i]); // 第一次出售的收益dp[1] =Math.max(dp[1],-prices[i]); // 第一次持有所花的钱for(int j = 2 ; j < 2*k ;j+=2){dp[j] = Math.max(dp[j],dp[j+1]+prices[i]); // 第j次出售的收益dp[j+1] =Math.max(dp[j+1],dp[j-2]-prices[i]);// 持有第j次的股票}}return dp[2*k-2];}

含有冷冻期的买卖股票时机:

在这里插入图片描述

分析:状态转移方程

未持有股票:
f [ i ] [ 0 ] = m a x ( f [ i − 1 ] [ 2 ] , f [ i − 1 ] [ 0 ] ) f[i][0] = max(f[i-1][2],f[i-1][0]) f[i][0]=max(f[i1][2],f[i1][0])
持有股票:
f [ i ] [ 1 ] = m a x ( f [ i − 1 ] [ 1 ] , f [ i − 1 ] [ 0 ] − p r i c e s [ i ] ) f[i][1] = max(f[i-1][1],f[i-1][0]-prices[i]) f[i][1]=max(f[i1][1],f[i1][0]prices[i])
冷冻期:
f [ i ] [ 2 ] = f [ i − 1 ] [ 0 ] + p r i c e s [ i ] f[i][2] = f[i-1][0]+prices[i] f[i][2]=f[i1][0]+prices[i]

public int maxProfit(int[] prices) {if (prices.length == 0) {return 0;}int n = prices.length;int[][] f = new int[n][3];f[0][1] = -prices[0];for (int i = 1; i < n; ++i) {f[i][0] = Math.max(f[i-1][2],f[i-1][0]);f[i][1] = Math.max(f[i-1][1],f[i-1][0]-prices[i]);f[i][2] = f[i-1][1]+prices[i];}return Math.max(f[n - 1][0], f[n - 1][2]);}

**优化:思路与前几题相似 **是用滚动数组进行空间优化

public int maxProfit(int[] prices) {if(prices.length==0)    return 0;int f1, f2 ,f3 , f4, f5, f6;   // f1 f6 :未持有  f2 f4: 冷冻期  f3 f5: 持有f1 = 0;f2 = 0;f3 = -prices[0];for(int i = 1; i < prices.length;++i){f4 = f3+prices[i];// -1 0  -1 2   0 2  4  f5 = Math.max(f1-prices[i],f3);f6 = Math.max(f2,f1);f2 = f4;f1 = f6;f3 = f5;}return Math.max(f1,f2);}

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

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

相关文章

【算法题】股票买卖问题解法详解

本解法是股票问题的通用解法&#xff0c;在leetcode上对应以下题&#xff1a; 买卖股票的最佳时机 买卖股票的最佳时机 II 买卖股票的最佳时机 III 买卖股票的最佳时机 IV 买卖股票的最佳时机含手续费 最佳买卖股票时机含冷冻期 下面来说通用解法&#xff1a; 这类问题…

贪心算法(股票买卖例题)

贪心算法定义&#xff1a; 贪心算法&#xff08;又称贪婪算法&#xff09;是指&#xff0c;在对 问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的是在某种意义上的局部 最优解。 贪心算法不是对所有…

买卖股票的最佳时机 II -数学推导证明贪心思路 -leetcode122

问题说明来源leetcode 一、问题描述: 122. 买卖股票的最佳时机 II 难度中等1941 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可…

产品开发利器:Axure及实例

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 文章目录 简介Axure优点Axure和蓝湖Axure实例 简介 Axure是一个最便捷、最热门的界面原型设计工具&#xff0c;它不需要任何编程或写代码基础&#xff0c;就可以设…

ChatGPT伪原创:智能AI助手助力文章创作

智能AI助手助力文章创作 随着人工智能技术的不断发展&#xff0c;智能AI助手正逐渐成为文章创作的得力工具。无论是在写作过程中提供灵感和创意&#xff0c;还是在文章编辑和校对中提供帮助&#xff0c;智能AI助手都能为作者节省时间和精力&#xff0c;提高文章质量。本文将从…

2022年度强化学习领域19个重要进展汇总

本文汇总梳理了2022年度&#xff0c;强化学习领域的发展重大事件、以及落地应用等方向中突出代表&#xff0c;整理难免带有个人观点&#xff0c;欢迎大家一起讨论。本文整理自“深度强化学习实验室”公众号&#xff0c;阅读原文请点击这里。 【1】MIT强化学习新算法EIPO&#…

分割一切?手把手教你部署SAM+LabelStudio实现自动标注

一&#xff0c;前言 最近Open-mmlab开源了Playground项目&#xff0c;将最近引起CV界轰动的SAM(Segment Anything Model)模型和Open-mmlab多个视觉框架相结合&#xff0c;可实现多种视觉任务的自动标注&#xff0c;本文将采用Open-mmlab的Playground开源项目&#xff0c;使用S…

老婆饼真有老婆,驴肉火烧有头驴--文言一心

困扰大家很久的问题&#xff1a;老婆饼里为啥没老婆&#xff0c;鱼香肉丝里为啥没有鱼。 最近&#xff0c;百度推出自己的AI大模型“文心一言”&#xff0c;李彦宏在发布会上表示&#xff0c;目前百度是全球大厂中第一个做出对标ChatGPT产品的企业。 有网友让文心一言作画&…

【2023,学点儿新Java-15】案例分享:基于Java实现餐厅点餐系统(附完整源代码)

前情回顾&#xff1a; 【2023&#xff0c;学点儿新Java-14】携程面试题&#xff1a;如何看待Java是一门半编译半解释型的语言&#xff1f;| 咨询互联网行业 资深前辈的一些问题 | 附&#xff1a;为什么说ChatGPT的核心算法是…&#xff1f;| GPT-3.5【2023&#xff0c;学点儿新…

文心一言作画:有点东西但不多...

随着ChatGPT的持续火热 与AI领域有关的话题 是越来越热闹了 前几天百度发布 “文心一言” 自然也成了网友们 重点关注的对象 不过大家的目光主要还是集中在 文心一言的绘画功能上 在人工智能加成下出来的画面 一个比一个绝 成功颠覆 大家对绘画的认知 生意火爆的商铺…

网传文心一言的魔性作图,有点被吓到...

来源&#xff1a;菜鸟教程 近日看到网友们用百度文心一言来作图&#xff0c;看了后我都愣住了。。。 1、AI 作画 -- 车水马龙 2、AI 作画 -- 驴肉火烧 3、AI 作画 -- 唐伯虎点秋香 4、AI 作画 -- 鱼香肉丝 5、AI 作画 -- 胸有成竹 6、AI 作画 -- 夫妻肺片 7、AI 作画 -- 红烧狮…

文心一言的魔性作图,我愣住了。。。

点关注公众号&#xff0c;回复“1024”获取2TB学习资源&#xff01; 最近&#xff0c;百度推出自己的AI大模型“文心一言”&#xff0c;李彦宏在发布会上表示&#xff0c;目前百度是全球大厂中第一个做出对标 ChatGPT 产品的企业。 但是&#xff0c;今天看到网友们用它来作图&a…

那些在学习GPT的过程中学到的

1、大模型是什么 GPT横空出世之后&#xff0c;大模型火了&#xff0c;什么是大模型呐&#xff1f; 大模型通常指的是具有大规模参数和复杂结构的深度学习模型。它们的设计和结构可以因任务而异&#xff0c;但以下是一些常见的大模型结构&#xff1a; Transformer&#xff1a…

LangChain 介绍及相关组件使用总结

一、langChain LangChain 是一个由语言模型LLMs驱动的应用程序框架&#xff0c;它允许用户围绕大型语言模型快速构建应用程序和管道。 可以直接与 OpenAI 的 ChatGPT 模型以及 Hugging Face 集成。通过 langChain 可快速构建聊天机器人、生成式问答(GQA)、本文摘要等应用场景。…

第一代AIGC硬件悄然爆发

文 | 智能相对论 作者 | 叶远风 看起来&#xff0c;这可能是一副正常的黑框眼镜&#xff0c;你戴上去彬彬有礼、斯斯文文&#xff1b; 实际上&#xff0c;它里边还装了一个“小伙伴”&#xff0c;你随时可以与它交流&#xff0c;谈天说地或者提出各种问题接受它的帮助&#x…

chatgpt赋能python:小黑框:Python程序员必备利器

小黑框&#xff1a;Python程序员必备利器 如果您是一名Python程序员&#xff0c;小黑框&#xff08;Terminal&#xff09;一定不陌生。小黑框是一种基于文本的用户界面&#xff0c;通常用于执行命令行任务&#xff0c;编写或调试代码等。Python程序员可以通过小黑框完成许多任…

游戏开发中防外挂的那些事儿

对于一个要上线的游戏&#xff0c;防外挂是必须的&#xff0c;历史上因为外挂而造成大量玩家流失的游戏数不胜数。随着游戏研发技术的发展&#xff0c;对外挂的预防业内其实做的已经越来越好了。下面总结一下防外挂的基础知识&#xff0c;以及我们的移动模块为防外挂做了哪些工…

游戏反外挂技术原理讲解

永远在路上 没有破解不了的反外挂系统&#xff0c;反外挂是一个对抗过程&#xff0c;需要不断升级。我们反外挂小组会采取对抗方式提升防御&#xff0c;也会研究竞品来获取灵感。反外挂也是非常有意思的&#xff0c;可以学到很多很多底层知识。 善战者无赫赫之功 反外挂&#x…

各网游的外挂是如何做出来的?

每一个致力于学习黑客技术的人&#xff0c;最后都分为三种人。 第一种&#xff1a;入侵&#xff0c;各种入侵&#xff0c;玩的就是入侵的快感&#xff0c;或者恶作剧的喜感&#xff0c;或者那种有特殊“窥视”癖好的人……别误会&#xff0c;小编我是喜欢“恶作剧&#xff0c;…

干货!什么是游戏外挂,外挂的种类及实现原理

外挂&#xff0c;原指一切用来破坏游戏程序正常游戏数据和逻辑的工具或破解版。比如可以修改游戏内存数据的修改器&#xff0c;又比如可以修改网络数据包的抓包工具。这类外挂或多或少会影响游戏的内存数据、文件数据、网络数据&#xff0c;甚至代码逻辑。 但随着外挂市场的发…