一道小算法题的思路

有这么一道小面试算法题:给定一个长度为 n 的整数数组,下标为 i 的元素表示第 i 天某个股票的价格,每次最多持有一股,每次买卖最多一股,在最多只买卖一次的情况下(先买后卖,不考虑融券等复杂形式),最大的收益是多少。

先考察一下可能的数据:

 0   1   2   3   4   5   6   7
12   9   6  10   8  22  20  15

由于是先买后卖,从数据上看,是在 2 处买入,5 处卖出时,得到收益为 16 最大。

而在股票一直下跌的情况下,不买不卖,得到的收益为 0 最大。

  1. o(n^2) 直观算法

    最简单的思路,就是从前向后逐个计算收益,求最大收益,如下:

     price[n]max_profit = 0for i = 0...n-2:for j = i+1...n-1:profit = price[j] - price[i]if profit > max_profit:max_profit = profit

    这个算法的复杂度为 o(n^2) ,能不能继续优化?

  2. o(n) 算法

    用归纳法分析一下,在第 n-1 天时,最大收益为 max_profit ,其中最小的价格为 min_price,那么第 n 天时,最大的收益计算为:

     if price[n] - min_price > max_profit:max_profit = price[n] - min_price

    因此,可把算法改为:

     price[n]max_profit = 0min_price = price[0]for i = 1...n-1:profit = price[i] - min_priceif profit > max_profit:max_profit = profitif min_price > price[i]:min_price = price[i]

    变化为 o(n) 复杂度。

  3. 推广变化

    现在,考虑更加复杂的形式,先来个允许不限次数的买卖,那么,在每一个递增的子区间,都能得到收益,总收益为各个收益的和:

     price[n]sum_profit = 0for i = 1...n-1:profite = price[i] - price[i-1]if profite > 0:sum_profit += profit

    再复杂一点,允许进行融券形式(即允许从券商借出后先卖后买),同样限制最多持有或融入 1 股,在结束前使得手上股票数为 0 。这种规则下,股票价格升降都会得到收益,总收益为:

     price[n]sum_profit = 0for i = 1...n-1:profite = price[i] - price[i-1]if profite < 0:sum_profite += -profiteelse:sum_profite += profite

    在此基础上,还可以放开一些限制条件,如不限制持有的数量等等。更进一步,可设定一个收益目标,符合收益目标的买卖组合,这样就更加现实意义有意思了。

转载于:https://www.cnblogs.com/fengyc/p/8618073.html

一道小面试算法题的思路相关推荐

  1. 力扣高频算法php_互联网公司最常见的面试算法题有哪些?

    很多时候,你即使提前复习了这些最常见的面试算法题,你依旧无法通过算法面试! 为什么?你在提前准备复习的时候,在网上找了半天相应题目的分析文章,但你看了就是不懂. 你在面试的时候,卡壳了,一时间忘了怎么 ...

  2. 【笔试面试题】腾讯2013实习生面试算法题及参考答案

    总结了一下自己遇到的以及同学遇到的面试算法题,是技术二面. 有几道题给出了参考答案,还有几道没有好的思路.路过的大侠如果有好的思路请留个言交流下呗~ 1.八数码问题:3*3的格子,有1~8个数,空了一 ...

  3. Java常见的面试算法题:实现两个线程交替打印1到100的数

    Java常见的面试算法题:实现两个线程交替打印1到100的数 思路: 这是涉及到多个线程打印的问题,一定会用到锁的(synchronized),故这就是一个多线程打印的典型案例. 代码实现: pack ...

  4. 互联网公司最常见的面试算法题大集合!

      转载于 新智元   来源:Github 编辑:元子 [导读]LeetCode是一个美国的在线编程网站,收集了各个大厂的笔试面试题,对找工作的毕业生和开发者来说,非常有价值.很多求职者都会在Leet ...

  5. C++经典面试算法题

    #include <assert.h> #include <string.h> #include <stack>// // C++ 经典面试算法题 [7/28/20 ...

  6. 常考面试算法题类型总结(来自知乎)

    作者:牛客网 链接:https://www.zhihu.com/question/24964987/answer/200681301 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  7. 常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可)

    常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可) 比较典型的题目,如下有: 题目一: 1.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程 ...

  8. 字节跳动2021年4月面试算法题库

    本文汇总了牛客2021.4.1~2021.4.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...

  9. 链表python笔试题目_python经典面试算法题1.4:如何对链表进行重新排序

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.4 对链表按照如下要求重新排序 [微软笔试题] 难度系数: ...

最新文章

  1. OpenStack环境搭建(五:附加项虚拟机文件备份使用)
  2. Spring是如何运用设计模式的?
  3. 使用wrk进行性能测试
  4. 时间序列数据库的秘密(3)——加载和分布式计算
  5. MIT线性代数:20.克拉默法则,逆矩阵和体积
  6. 分享一些支持多租户的开源框架
  7. java buffalo_随你怎么玩!Buffalo 网络硬盘新潮流
  8. apache.camel_Apache Camel 2.12 –支持后退,以减少不太积极的轮询路线
  9. java辐射汉化_新研究:低强度环境辐射足以导致量子比特退相干
  10. 故障恢复 stm32_77条STM32知识,千万不能错过!干货
  11. 计算机操作系统-1days
  12. 知识总结2:Django常见面试题总结(持续更新)
  13. Model-based evolutionary algorithms: a short survey 阅读笔记
  14. html设计一个网页表格,21个新奇古怪的网页表格设计
  15. 高德地图海量点 API 初探
  16. 布尔代数中表达式的展开及因式分解的技巧
  17. 基于Altium Designer进行单片机逻辑系统及模拟电路原理图设计
  18. GitLab -- 简单使用CICD功能
  19. bootstrap js插件篇——提示框、弹出框、警告框
  20. Android 文件下载中文名乱码的解决办法

热门文章

  1. python颜色识别_颜色检测python
  2. 软文怎么写比较吸引人?写软文应注意什么
  3. linux下阻塞的系统调用,Linux下socket设置为非阻塞方式和fcntl系统调用.pdf
  4. 用pytorch构造GELU激活函数
  5. Python 使用pandas处理Excel —— 快递订单处理 数据匹配 邮费计算
  6. 一个简单的基于知识图谱的影视剧推荐系统
  7. 白天定时晚上提醒的软件有没有?
  8. 小程序js中data获取服务器数据,微信小程序 获取javascript 里的数据
  9. 【zimg入门之一】zimg高性能图片服务器浅谈
  10. git报错解决 pathspec