美团2016招聘笔试(股票交易日)

题目描述
在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。请采用实践复杂度低的方法实现。
给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。
测试样例:
[10,22,5,75,65,80],6
返回:
87
分析:
一般看到这种题目,我们应该怎么分析呢?(如果你会做的话就可以值写代码了,没必要分析)。针对这个题(个人拙见)。降低难度:题目要求进行最多两次买卖,如果进行一次呢?我们应该怎么分析?如果进行一个买卖求收益的最大值,对于第i时刻的值,找到[i+1,n]时刻的最大差值。这样就搞定一次的买卖的问题了。这样就出现了一个思路,如果我们将n个时刻,安装第i天分开[1,i]和[i+1,n]两个时间段,对每一个时间段求一次最大值就可以了,现在就是遍历一下i得到最大的收益就好了。如果时间段中不存在收益,那就不进行这次买卖,即时买卖的收益为0。
下面就是如何求一次买卖的最大收益:
10
22
5
75
65
80

如何计算第i个值与其之后值的最大差值呢?对每一个值i,遍历i+1之后的所有的值,保存最大差值就好了。代码:

//时间复杂度是O(n^2)
vector<int> maxDifference(int n){vector<int> result;for(int i=0;i<n;i++){int maxdiff = 0;for(int j=i+1;j<n;j++){maxdiff = max(maxdiff,a[j] - a[i]);}result.push_back(maxdiff);}return result;
}

这是时间复杂度的O(n^2)。能不能继续降低时间复杂度呢?当然可以?我们可以这样想对于A[i],我们需要找到的是A[i+1 – n]的最大值。因此我们如果从后往前进行遍历,并且纪录下来最大值maxvalue,就可以在O(n)时间搞定这个问题。


vector<int> maxDifferencePlus(int *a,int n){vector<int> result(n,0);//后面没有比当前值大的数,就返回0int maxvalue = a[n-1];for(int i=n-1;i>=0;i--){if(a[i]>maxvalue) maxvalue = a[i];result[i] = maxvalue - a[i];}return result;
}

目前我们求的是1-n之间的所有i的最大收益,我们将程序修改一下得到i-j之间的值。下面就可以这直接求解题目的解,以i为分界点,计算[0-i]和[i+1,n-1]的最大值的和,遍历一下i即可得到最优解。时间复杂度是O(n^2),估计还能继续优化,小喵这里没有给出,可以遍历一次存下来最大的差值。

Code:

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
int a[] = {10,22,5,75,65,80};//时间复杂度是O(n^2)
vector<int> maxDifference(int *a, int n){vector<int> result;for(int i=0;i<n;i++){int maxdiff = 0;for(int j=i+1;j<n;j++){maxdiff = max(maxdiff,a[j] - a[i]);}result.push_back(maxdiff);}for(int i=0;i<n;i++){cout<<result[i]<<" ";}cout<<endl; return result;
}vector<int> maxDifferencePlus(int *a,int n){vector<int> result(n,0);//后面没有比当前值大的数,就返回0int maxvalue = a[n-1];for(int i=n-1;i>=0;i--){if(a[i]>maxvalue) maxvalue = a[i];result[i] = maxvalue - a[i];}for(int i=0;i<n;i++){cout<<result[i]<<" ";}cout<<endl;return result;
}
vector<int> maxDifferencePlus(int *a,int begin,int end){vector<int> result(end-begin+1,0);//后面没有比当前值大的数,就返回0int maxvalue = a[end];for(int i=end;i>=begin;i--){if(a[i]>maxvalue) maxvalue = a[i];result[i] = maxvalue - a[i];}for(int i=begin;i<=end;i++){cout<<result[i]<<" ";}cout<<endl;return result;
}
int getmaxValue(vector<int> a){int v = 0;for(int i=0;i<a.size();i++){v = max(v,a[i]);}return v;
}int buy2sale(int *a,int n){int result = 0;vector<int> left;vector<int> right;for(int i=1;i<n-1;i++){left = maxDifferencePlus(a,0,i);right = maxDifferencePlus(a,i+1,n-1);result = max(result, getmaxValue(left)+getmaxValue(right));}return result;
}int main()
{   maxDifference(a,6);maxDifferencePlus(a,6);maxDifferencePlus(a,1,4);cout<<buy2sale(a,6)<<endl;return 0;
}

名企笔试:美团2016招聘笔试(股票交易日)相关推荐

  1. 美团2016招聘笔试:奇数位丢弃

    对于一个由0-n的所有数按升序组成的序列,我们要进行一些筛选,每次我们取当前所有数字中从小到大的第奇数位个的数,并将其丢弃.重复这一过程直到最后剩下一个数.请求出最后剩下的数字. 输入描述: 每组数据 ...

  2. 名企笔试:腾讯2016招聘笔试(微信红包)

    名企笔试:腾讯2016招聘笔试(微信红包) 题目描述 春节期间小明使用微信收到很多个红包,非常开心.在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半.请帮小明找到该红包金额.写出具 ...

  3. 算法题:旅途(楚楚街2016招聘笔试)

    名企笔试:楚楚街2016招聘笔试(旅途) 题目描述 原来是要到醋溜站台乘坐醋溜快车到醋溜港",亮亮解出了地图隐藏的秘密,赶紧奔向醋溜站台,但到了之后,亮亮忧桑地发现,从醋溜站台到醋溜港沿途的 ...

  4. 楚楚街2016招聘笔试(航线)

    楚楚街2016招聘笔试(航线) 题目描述 "呼!!终于到了,可是接下来要怎么走才能到达楚楚街港港呢?"亮亮在醋溜港直发愁. 突然"啾"的一下,一只银色小船出现在 ...

  5. 算法题:解密(楚楚街2016招聘笔试)

    名气笔试:楚楚街2016招聘笔试(解密) 题目描述 亮亮深吸一口气,小心地将盒子打开,里面是一张地图,地图上除了一些奇怪的字母以外没有任何路线信息,这可让亮亮犯了愁,这些字母代表了什么意思呢? 亮亮绞 ...

  6. 网易2016招聘笔试升级之路Java代码

    本文地址:http://blog.csdn.net/shanglianlm/article/details/72968583 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能 ...

  7. 蘑菇街2016招聘笔试

    题目描述 给定一个字符串,问是否能通过添加一个字母将其变为回文串. 输入描述: 一行一个由小写字母构成的字符串,字符串长度小于等于10. 输出描述: 输出答案(YES\NO). 输入例子: coco ...

  8. 楚楚街2016招聘笔试(旅途)(未完待续)

    题目描述 原来是要到醋溜站台乘坐醋溜快车到"醋溜港",亮亮解出了地图隐藏的秘密,赶紧奔向醋溜站台 但到了之后,亮亮忧桑地发现,从醋溜站台到醋溜港沿途的每个车站都有很多美女被他飒爽的 ...

  9. 美团笔试题:股票交易日

    在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行).给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益. ...

最新文章

  1. 挖矿让英伟达多赚了近3亿美元,老黄:又创纪录了
  2. please wait while windows configures microsoft visual studio professional 2013
  3. Spring Boot 最佳实践(三)模板引擎FreeMarker集成
  4. java虚拟机(JVM)的内存设置
  5. Spring后处理Bean(BeanPostProcessor 接口)Bean增强
  6. Tomact运行不起来,打开startup.bat 一闪而过
  7. 体外肿瘤细胞敏感性分析试剂盒 实验原理
  8. 功能丰富强大的开源HEVC分析软件 “ Gitl HEVC Analyzer ”
  9. html打印多了空白页,为什么打印Word文档会多打印出一空白页
  10. Excel 预习阶段Day4
  11. Cannot resolve org.springframework.boot:spring-boot-starter-web:2.2.6.RELEAS
  12. 监听浏览器返回,可清除历史记录(移动端:手势返回)(vue)
  13. php workman消息提醒,原生workman实现消息推送
  14. 蚂蚁区块链BaaS平台应用开发指南(一):前言
  15. C 时间库 time.h 获取当前时间
  16. Android学习之仿QQ側滑功能的实现
  17. 使用git强行切换分支
  18. Spark:Caused by: java.lang.ClassNotFoundException: scala.Product$class解决
  19. 【智慧社区解决方案】视频智能检测与分析技术如何赋能社区智慧化建设?
  20. redission-解锁

热门文章

  1. 高防CDN怎么防攻击,能防什么攻击?
  2. 20Python爬虫--Scrapy爬取和讯博客个人所有博客情况并保存到数据库
  3. python网页登录钉钉_关于钉钉接口使用Python,Post 500报错
  4. 全国各大学精品课程网站
  5. 特征筛选:重要性评估
  6. 基于matlab的漏电保护器仿真,基于MATLAB仿真的高压断路器振动信号故障诊断
  7. 图标设计原则_图标设计的7个原则
  8. excel排名技巧:万能透视表加筛选找出销售冠军
  9. 随便记录一下:微信公众号后台管理系统,获取需要扫描的二维码
  10. 英汉词典 JaVa_Java案例_英汉字典_技术文章