一道小面试算法题的思路
一道小算法题的思路
有这么一道小面试算法题:给定一个长度为 n 的整数数组,下标为 i 的元素表示第 i 天某个股票的价格,每次最多持有一股,每次买卖最多一股,在最多只买卖一次的情况下(先买后卖,不考虑融券等复杂形式),最大的收益是多少。
先考察一下可能的数据:
0 1 2 3 4 5 6 7
12 9 6 10 8 22 20 15
由于是先买后卖,从数据上看,是在 2 处买入,5 处卖出时,得到收益为 16 最大。
而在股票一直下跌的情况下,不买不卖,得到的收益为 0 最大。
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)
,能不能继续优化?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)
复杂度。推广变化
现在,考虑更加复杂的形式,先来个允许不限次数的买卖,那么,在每一个递增的子区间,都能得到收益,总收益为各个收益的和:
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
一道小面试算法题的思路相关推荐
- 力扣高频算法php_互联网公司最常见的面试算法题有哪些?
很多时候,你即使提前复习了这些最常见的面试算法题,你依旧无法通过算法面试! 为什么?你在提前准备复习的时候,在网上找了半天相应题目的分析文章,但你看了就是不懂. 你在面试的时候,卡壳了,一时间忘了怎么 ...
- 【笔试面试题】腾讯2013实习生面试算法题及参考答案
总结了一下自己遇到的以及同学遇到的面试算法题,是技术二面. 有几道题给出了参考答案,还有几道没有好的思路.路过的大侠如果有好的思路请留个言交流下呗~ 1.八数码问题:3*3的格子,有1~8个数,空了一 ...
- Java常见的面试算法题:实现两个线程交替打印1到100的数
Java常见的面试算法题:实现两个线程交替打印1到100的数 思路: 这是涉及到多个线程打印的问题,一定会用到锁的(synchronized),故这就是一个多线程打印的典型案例. 代码实现: pack ...
- 互联网公司最常见的面试算法题大集合!
转载于 新智元 来源:Github 编辑:元子 [导读]LeetCode是一个美国的在线编程网站,收集了各个大厂的笔试面试题,对找工作的毕业生和开发者来说,非常有价值.很多求职者都会在Leet ...
- C++经典面试算法题
#include <assert.h> #include <string.h> #include <stack>// // C++ 经典面试算法题 [7/28/20 ...
- 常考面试算法题类型总结(来自知乎)
作者:牛客网 链接:https://www.zhihu.com/question/24964987/answer/200681301 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- 常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可)
常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可) 比较典型的题目,如下有: 题目一: 1.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程 ...
- 字节跳动2021年4月面试算法题库
本文汇总了牛客2021.4.1~2021.4.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...
- 链表python笔试题目_python经典面试算法题1.4:如何对链表进行重新排序
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.4 对链表按照如下要求重新排序 [微软笔试题] 难度系数: ...
最新文章
- OpenStack环境搭建(五:附加项虚拟机文件备份使用)
- Spring是如何运用设计模式的?
- 使用wrk进行性能测试
- 时间序列数据库的秘密(3)——加载和分布式计算
- MIT线性代数:20.克拉默法则,逆矩阵和体积
- 分享一些支持多租户的开源框架
- java buffalo_随你怎么玩!Buffalo 网络硬盘新潮流
- apache.camel_Apache Camel 2.12 –支持后退,以减少不太积极的轮询路线
- java辐射汉化_新研究:低强度环境辐射足以导致量子比特退相干
- 故障恢复 stm32_77条STM32知识,千万不能错过!干货
- 计算机操作系统-1days
- 知识总结2:Django常见面试题总结(持续更新)
- Model-based evolutionary algorithms: a short survey 阅读笔记
- html设计一个网页表格,21个新奇古怪的网页表格设计
- 高德地图海量点 API 初探
- 布尔代数中表达式的展开及因式分解的技巧
- 基于Altium Designer进行单片机逻辑系统及模拟电路原理图设计
- GitLab -- 简单使用CICD功能
- bootstrap js插件篇——提示框、弹出框、警告框
- Android 文件下载中文名乱码的解决办法
热门文章
- python颜色识别_颜色检测python
- 软文怎么写比较吸引人?写软文应注意什么
- linux下阻塞的系统调用,Linux下socket设置为非阻塞方式和fcntl系统调用.pdf
- 用pytorch构造GELU激活函数
- Python 使用pandas处理Excel —— 快递订单处理 数据匹配 邮费计算
- 一个简单的基于知识图谱的影视剧推荐系统
- 白天定时晚上提醒的软件有没有?
- 小程序js中data获取服务器数据,微信小程序 获取javascript 里的数据
- 【zimg入门之一】zimg高性能图片服务器浅谈
- git报错解决 pathspec