有一道算法题,很有意思:给你一个数组,代表每天股票的买/卖价序列,要求在序列期间内最多只允许买、卖各一次(先买后卖,买要在卖之前),求此期间内的最大收益是多少(可以选择不卖,即收益为0)。举例如下:

  1. 价格序列为[7,1,5,3],则代表第一天股票价格为7,第二天为1,第三天为5,第四天为3(数组长度不定),此时第二天价格为1的时候买入,第三天价格为5的时候卖出,则赚取最大的收益4。如果到了第四天再卖,则只能收益2了。你也不能第一天卖,第二天买,虽然收益是6,但是没有买就卖不出去,只能先买后卖,所以这样是犯规的
  2. 价格序列为[7,1,5,3,6,4],则最大收益为5,即选择第2天买入(买入价1)、第5天卖出(卖出价6)
  3. 价格序列为[7,6,4,3,1],则最大收益率为0,即只能选择买入,但因为价格持续下降,所以无法卖出。这种持续走低的情况还不如不买,也就是收益为0

好了,题目就是这样,怎样计算最大的收益呢?如果用暴力破解,也就是O(n2)的时间复杂度,这样也可以算出来,但是要遍历两遍,相当不经济。有没有遍历一遍就能算出来的办法呢?有的,答案就是动态规划!动态规划能够把n平方的复杂度,简化为n的复杂度,着实厉害啊!

遍历到第一天的时候,我们记住价格,遍历到第二天的时候,我们可以得到前两天的最小值,遍历到第三天的时候,我们可以得到前三天的最小值……当我们遍历到N天的时候,我们可以得到前N天的最小值,然后和N+1天的价格相比,如果N+1天的价格小于等于前N天的最小值,那么肯定是不能卖的,那么就刷新最小值!如果N+1天的价格大于前N天的最小值,那么就计算前N天的最小值与N+1天的价格的差,也就是盈利差,并随时记录下来!如果遇到更大的,就不断刷新,就像一项记录一样,如果打破了就刷新最高值,没有打破就维持原来的最高值。当然盈利差初始化为0,这个也很好理解。算到最后一天,我们不仅得到了所有天数里面的最小价格,还得到了最大的盈利差,这个盈利差就是需要返回的答案!思路分析到这里,下面是实现的代码,供参考:

/*** 算法:计算交易日股票最大收益* @param prices 各交易日股价* @author LiYang* @return 最大的股票价差(收益)*/
public static int maxStockProfit(int[] prices) {// 交易日不足2日,则返回0if (prices == null || prices.length == 0 || prices.length == 1) {return 0;}// 初始设置历史最低价为第一天的股价int lowestPriceInHistory = prices[0];// 最大股票价差(收益)初始化为0int maxProfit = 0;// 从第二个交易日开始遍历计算for (int i = 1; i < prices.length; i++) {// 如果当前交易日股价,比历史最低价要高if (prices[i] - lowestPriceInHistory > 0) {// 更新最高的股票价差(收益)maxProfit = Math.max(prices[i] - lowestPriceInHistory, maxProfit);} else {// 否则更新历史最低价lowestPriceInHistory = prices[i];}}// 返回最终计算的最大股票价差(收益)return maxProfit;
}

算法:计算股票的最大收益(动态规划经典案例)相关推荐

  1. 用聚类算法计算股票的支撑位和阻力位

    本文将向您展示如何使用不同的聚类算法计算股票支撑位和阻力位. 股票数据 - 我在 mongoDB 数据库中有股票数据.您还可以免费从雅虎财经获取这些数据. Python 连接 MongoDB 设置 I ...

  2. html中js计算百钱百鸡,JS经典案例之百钱百鸡

    今天我们来回顾一下JS的经典案例之百钱百鸡 题目 公鸡5元钱一只,母鸡3元钱一只,小鸡3只一元钱,用100元钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100元钱 ...

  3. 买卖股票的最大收益-动态规划

    给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计一个算法来 ...

  4. 算法——买卖股票(动态规划)

    买卖股票 准备总结一下做过的几道买卖股票的题目,还有几道还没来得及做,先把做过的做一个总结,以便日后忘了,留作复习使用. 题目难度又简到难.(一些题目直接参考的是官方题解).有很多地方理解不到位或者是 ...

  5. 【数据结构与算法】之动态规划经典问题

    前言 本文为 [数据结构与算法]动态规划 经典问题相关介绍 ,具体将对最长递增子序列问题,找零钱问题,0-1背包问题相关动态规划算法问题进行详尽介绍~

  6. [Leetcode] 买卖股票合集(动态规划)

    写完这套题,再搞一台时光机,财务自由不是梦(Doge) ================================== 相关题目链接 121 买卖股票的最佳时机 122 买卖股票的最佳时机 II ...

  7. 《跟我学算法系列文章——一文吃透动态规划》

    <一文吃透动态规划--Dynnamic Planning> 关键词:DP算法 面试 最值问题 子序列问题 子数组问题 回文问题 回溯算法 文章目录 <一文吃透动态规划--Dynnam ...

  8. Algorithm之PrA:PrA之nLP非线性规划算法经典案例剖析+Matlab编程实现

    Algorithm之PrA:PrA之nLP整数规划算法经典案例剖析+Matlab编程实现 目录 有约束非线性规划案例分析 1.投资决策问题 2.利用Matlab实现求解下列非线性规划​ 无约束极值问题 ...

  9. 动态规划经典题目_动态规划经典题目:鸡蛋掉落(附视频讲解)

    题目: 思路: 先放上视频讲解 动态规划经典题目:鸡蛋掉落https://www.zhihu.com/video/1225199247848513536 纠正:视频里的状态转移方程漏写了一个+1,意思 ...

  10. 基于MVS的三维重建算法学习笔记(四)— 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读

    基于MVS的三维重建算法学习笔记(四)- 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读 声明 SGM概述 Cost Calculation(像素代价计算)--M ...

最新文章

  1. 小米面试题:合并二叉树
  2. nginx修改监听端口号8080_Nginx + Tomcat 配置
  3. php在空值时调用成员函数_当Vlookup函数匹配的结果是时间,或者空值时,显示不正常了...
  4. Java 8中的可重复注释
  5. mysql利用tgz恢复_Mysql备份与恢复方法_MySQL
  6. 有了这个数据强一致“利器”,DBA们轻松修复数据对加班“say no”
  7. Eclipse如何不使用alt+/来实现自动提示
  8. JDK 1.8新特性
  9. 【报告分享】2021年双11电商营销全景洞察.pdf(附下载链接)
  10. mysql负变量_MySQL的变量
  11. 聚类算法实践——层次、K-means聚类
  12. 通用非即插即用监视器分辨率_为什么垂直分辨率监视器的分辨率通常是360的倍数?...
  13. 宏山激光sigmatube套料软件多台电脑安装教程
  14. 清吧音响怎么选?看看这个黄金搭配,跟着买就对了
  15. Ant下载安装及使用详解
  16. wxformbuilder软件制作gui界面教程
  17. 远程桌面 - linux
  18. matlab中true()函数的用法
  19. python中zerodivisionerror是什么意思-python里的raise是什么意思
  20. 向PVFS工程中添加新文件

热门文章

  1. 微盾php脚本解密,微盾php解密(黑刀微盾解密专家)
  2. 关于用KMS的时候手欠把原装正版win11的激活卸载了怎么办
  3. 极点五笔的一些快捷键
  4. 细聊智能家居开发中必备的通信协议
  5. 智能家居控制系统制作技术_【动态】HDL在欧洲推广智能家居技术
  6. ora 01033 linux,ORA-01033: ORACLE initialization or shutdown in progres
  7. PR曲线、ROC曲线、AUC、AP简单梳理
  8. 移动安全(1) - Win10 drozer环境搭建
  9. 怎么样利用栅格数据分类后的结果以行政区域统计各个地类的面积
  10. SQL数据分析常用案例总结