程序员算法实现-买卖股票的最佳时机系列问题

程序员算法实现-买卖股票的最佳时机系列问题,第1张

主要思路:因为只有一股可以交易,所以我们可以枚举 必须以i位置作为卖出时机的情况下,得到的最大收益是多少。如果我们得到每个i位置的最大收益,那么最大收益必是所有位置的最大收益的最大值

使用两个变量:

min变量:表示遍历到的位置之前的最小值是什么。

max变量:表示当前收集到必须以i位置卖出的最大收益是多少。

遍历数组一遍,在遍历到i位置的时候,min和max的更新逻辑如下:

遍历完数组,返回max的值就是最终答案。完整代码见:

主要思路:由于可以进行任意次的交易,但是任何时候最多只能持有一股股票,所以我们可以把股票曲线的所有 上升段 都抓取到,累加收益就是最大收益。遍历数组,遍历到的位置减去前一个位置的值,如果是正数,就收集,如果是负数,就把本次收益置为0(就等于没有做这次交易),这样遍历一遍数组,就不会错过所有的收益。

设置一个变量max,初始为0,用于收集最大收益值,来到i位置,max更新逻辑如下:

完整代码如下:

由本题可以简单得出一个结论: 如果数组元素个数为N,则最多执行N/2次交易就可以抓取所有的上升段的值(极端情况下,当前时刻买,下一个时刻卖,保持这样的交易一直到最后,执行的交易次数就是N/2)

主要思路:

在第2种情况下,我们定义

其中dp[i][j]表示[0i]范围内交易j次获得的最大收益是多少。如果可以把dp这个二维表填好,那么返回dp[N-1][k]的值就是题目要的答案。

dp这个二维矩阵中,

第一行的值表示数组[00]范围内,交易若干次的最大收益,显然,都是0。

第一列的值表示数组[0i]范围内,交易0次获得的最大收益,显然,也都是0。

针对任何一个普遍位置dp[i][j]的值,

我们可以枚举i位置是否参与交易,如果i位置不参与交易,那么dp[i][j] = dp[i-1][j],如果i位置参与交易,那么i位置一定是最后一次的卖出时机

那最后一次买入的时机,可以是如下情况:

最后一次买入的时机在i位置,那么dp[i][j] = dp[i][j-1] - arr[i] + arr[i]

最后一次买入的时机在i-1位置,那么dp[i][j] = dp[i-1][j-1] - arr[i-1] + arr[i]

最后一次买入的时机在i-2位置,那么dp[i][j] = dp[i-2][j-1] - arr[i-2] + arr[i]

最后一次买入的时机在0位置,那么dp[i][j] = dp[0][j-1] - arr[0] + arr[i]

完整代码如下:

上述代码中包含一个枚举行为

增加了时间复杂度,我们可以优化这个枚举。

我们可以举一个具体的例子来说明如何优化,

比如,

当我们求dp[5][3]这个值,我们可以枚举5位置是否参与交易,假设5位置不参与交易,那么dp[5][3] = dp[4][3],假设5位置参与交易,那么5位置一定是最后一次的卖出时机。那最后一次买入的时机,可以是如下情况:

最后一次买入的时机在5位置,那么dp[5][3] = dp[5][2] - arr[5] + arr[5]

最后一次买入的时机在4位置,那么dp[5][3] = dp[4][2] - arr[4] + arr[5]

最后一次买入的时机在3位置,那么dp[5][3] = dp[3][2] - arr[3] + arr[5]

最后一次买入的时机在2位置,那么dp[5][3] = dp[2][2] - arr[2] + arr[5]

最后一次买入的时机在1位置,那么dp[5][3] = dp[1][2] - arr[1] + arr[5]

最后一次买入的时机在0位置,那么dp[5][3] = dp[0][2] - arr[0] + arr[5]

我们求dp[4][3]这个值,我们可以枚举4位置是否参与交易,假设4位置不参与交易,那么dp[4][3] = dp[3][3],假设4位置参与交易,那么4位置一定是最后一次的卖出时机。那最后一次买入的时机,可以是如下情况:

最后一次买入的时机在4位置,那么dp[4][3] = dp[4][2] - arr[4] + arr[4]

最后一次买入的时机在3位置,那么dp[4][3] = dp[3][2] - arr[3] + arr[4]

最后一次买入的时机在2位置,那么dp[4][3] = dp[2][2] - arr[2] + arr[4]

最后一次买入的时机在1位置,那么dp[4][3] = dp[1][2] - arr[1] + arr[4]

最后一次买入的时机在0位置,那么dp[4][3] = dp[0][2] - arr[0] + arr[4]

比较dp[5][3]和dp[4][3]的依赖关系,可以得到如下结论:

假设在求dp[4][3]的过程中,以下递推式的最大值我们可以得到

dp[4][2] - arr[4]

dp[3][2] - arr[3]

dp[2][2] - arr[2]

dp[1][2] - arr[1]

dp[0][2] - arr[0]

我们把以上式子的最大值定义为best,那么

dp[5][3] = Mathmax(dp[4][3],Mathmax(dp[5][2] - arr[5] + arr[5], best + arr[5]))

所以dp[5][3]可以由dp[4][3]加速得到,

同理,

dp[4][3]可以通过dp[3][3]加速得到,

dp[3][3]可以通过dp[2][3]加速得到,

dp[2][3]可以通过dp[1][3]加速得到,

dp[1][3]可以很简单得出,dp[1][3]有如下几种可能性:

可能性1,1位置完全不参与,则

可能性2,1位置作为最后一次的卖出时机,买入时机是1位置

可能性3,1位置作为最后一次的卖出时机,买入时机是0位置

此时,best的值为

然后通过dp[1][3]加速dp[2][3],通过dp[2][3]加速dp[3][3],所以二维dp的填写方式是按列填,

先填dp[1][0],dp[1][2]一直到dp[1][k],填好第一列;

然后填dp[2][0],dp[2][1]一直到dp[2][k],填好第二列;

依次填好每一列,直到填完第N-1列。

枚举行为被优化,优化枚举后的完整代码如下:

主要思路:上一个问题中,令k=2就是本题的答案。

主要思路:因为有了冷冻期,所以每个位置的状态有如下三种:

定义三个数组,分别表示i位置这三种情况下的最大值是多少

显然有如下结论:

针对一个普遍位置i

最大收益就是如上三种方式的最大值。完整代码见:

由于三个数组有递推关系,所以可以用三个变量替换三个数组,做空间压缩,优化后的代码如下:

主要思路:由于没有冷冻期,所以在i位置的时候,状态只有两种

针对0位置

针对普遍位置i

完整代码如下:

同样的,两个数组都有递推关系,可以做空间压缩,简化后的代码如下:

原文链接:买卖股票的最佳时机系列问题 - Grey Zeng - 博客园

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/meirong/2299162.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-11-24
下一篇2023-11-24

随机推荐

  • sk2精华露使用顺序

    第1个步骤就是先进行面部的清洁,清洁完了之后需要在脸上拍一点爽肤水,接着需进一步的修复,用旗下的补水保湿修复精华露来进行修复,那这款精华露当中所含有的pitera乃是神仙水的整整4倍,所以能达到强效保湿补水的效果,绝对是干皮的救星。在这个步

    2024-04-15
    26300
  • 十大公认的美白身体乳

    十大公认的美白身体乳:凡士林美白身体乳、三豆奇异果身体乳、sesderma美白身体乳、Olay美白身体乳、AlphaHydrox果酸身体乳、ASDM强效美白身体乳、森田全净白保湿乳液、日本DAISO大创美白乳液、妮维雅美白身体乳、MENEM

    2024-04-15
    19000
  • 春季旺销产品有哪些

    春天是一个美好的季节,但是春天乍暖还寒,所以保暖的家纺用品一定要准备好哦。还有春天潮湿多雨,家居除湿、干衣的电器也是非常重要的。季节的变换,春季也不能忘了好好护肤。接下来小编从春季生活电器、春季家纺、春季护肤三个方面入手,为大家推荐春日好物

    2024-04-15
    19800
  • 伊思水乳保质期 伊思水乳保质期多久

    伊思水乳产品好用所以囤货的朋友可不少,可是因为季节的变换却难免有久放的产品,有的还没有打开,有的已经打开没用完,那么伊思水乳保质期是多久,打开的伊思水乳还能用吗,没打开的伊思水乳可以放多久呢?伊思水乳保质期多久开封起1年,伊思瓶子

    2024-04-15
    8400
  • 精华露的正确使用步骤

    精华液和精华液本质上是一样的,所以用的顺序是一样的,爽肤水之后,乳液之前。但也有一些品牌的精华比较特殊,在爽肤水之前使用,也就是洁面后的第一步,比如:秘密美白柔滑精华、雪花秀保湿精华。1洗脸:洗面奶、面霜或慕思是最常用的洗脸方法。2涂抹爽肤

    2024-04-15
    9600
  • 妮维维和妮维雅有什么区别吗

    妮维维和妮维雅是两个不同的品牌。妮维雅(Nivea)中文曾译为能维雅。来自德国的护肤品牌妮维雅(Nivea)是拜尔斯道夫公司BeiersdorfAG(简称BDF)所有,妮维维是中国的一个小型化妆品品牌。关于妮维雅美白身体乳液,瓶身上全是英文

    2024-04-15
    10700
  • 什么面霜补水保湿效果最好 好用的面霜公认最好用

    面霜是很受大家喜爱的护肤品之一,面霜的质地都比较醇厚滋润,一般在秋冬干燥季节使用的人更多,市面上好用的面霜有很多,功效作用都有差别。什么面霜补水保湿效果最好1、雅漾修护保湿霜 售价:40ml159元 很赞的一款产品哦。不但保湿效果

    2024-04-15
    15900

发表评论

登录后才能评论
保存