第一问:

对于只有一次买入卖出的最大收益可以参照http://blog.csdn.net/calmreason/article/details/7904062,已经将的非常详细了

第二问:

当时做完这种情况后,考官又提出如果可以买入卖出两次,如何在O(N)的时间复杂度下解决问题,当时没有想出来,结果就挂了,今天想把这个问题解决掉

思路大体是这样的,如果要买卖两次的话(这里允许在同一时间卖出再买入,但是不允许同一时间买入再卖出),必定是在某一个时间点的两边进行买入和卖出的,这样就可以把问题简化为在某一个时间点左右进行一次股票买入和卖出的最大收益了。

其中在某一个时间节点左侧的最大收益是可以通过O(N)的时间复杂度得到的,只要在第一问的基础上设置一个数组ret1List[] 来存放当前节点的最大收益就可以了。问题是如何接下来计算右边的最大收益,最后发现如果将数组从后到前来遍历,再设置一个数组ret2List[] 来存放当数组从后到前来遍历时当前的最小收益,那么-1 * ret2List[]的值就对应了右边的最大收益。最后再遍历一遍,找到ret1List[i] - ret2List[i]的最大值,就是所要求的结果

代码如下:

#include <iostream>
using namespace std;
#define LEN 100int _tmain(int argc, _TCHAR* argv[])
{int n;cin >> n;if(n < 3){cout << "error input" << endl;return -1;}int list[LEN];int ret1List[LEN]; //存放从左向右遍历时每个节点的最大收益int ret2List[LEN];   //存放从右到左遍历时每个节点的最小收益for(int i = 0; i < n; i ++){cin >> list[i];}int minNum = list[0];int maxDifferent = list[1] - list[0];for(int i = 1; i < n - 1; i ++){if(list[i] < minNum){minNum = list[i];}else if(list[i] - minNum > maxDifferent){maxDifferent = list[i] - minNum;}ret1List[i] = maxDifferent;}int maxNum = list[n - 1];int minDifferent = list[n - 2] - list[n - 1]; for(int i = n - 2; i > 0; i --){if(list[i] > maxNum){maxNum = list[i];}else if(list[i] - maxNum < minDifferent){minDifferent = list[i] - maxNum;}ret2List[i] = minDifferent;}int max = ret1List[1] - ret2List[1];for(int i = 1; i < n - 1; i ++){if(max < ret1List[i] - ret2List[i]){max = ret1List[i] - ret2List[i];}}cout << max << endl;return 0;
}

网易游戏面试--两次股票买入卖出的最大收益相关推荐

  1. 漫画:程序教你寻找股票买入卖出的最佳时机(动态规划)

    作者 | 小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui) 前一段时间,我们介绍了一个经典算法题目:寻找股票买入卖出的最佳时机.这个题目看似简单,却有着许多种变化. 在上一篇中 ...

  2. 漫画:寻找股票买入卖出的最佳时机(动态规划)

    前一段时间,我们介绍了一个经典算法题目:寻找股票买入卖出的最佳时机.这个题目看似简单,却有着许多种变化. 在上一篇中,我们讲解了最多1次买卖和无限次买卖的解法,那么,如果只允许最多2次股票买卖,如何寻 ...

  3. 股票买入卖出 LeetCode 变形题 度小满

    度小满,股票买入卖出变种题. 最大化收益,最小化买卖次数. def stock():profit = 0length = len(trade)count = 0for i in range(lengt ...

  4. 股票买入卖出问题 leetcode123(最多k次交易)

    leetcode123 问题链接 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/ 给定一些天数的股票价格list, ...

  5. 漫画:寻找股票买入卖出的最佳时机

    -----  第二天  ----- 什么意思呢?让我们来举个例子,给定如下数组: 该数组对应的股票涨跌曲线如下: 显然,从第2天价格为1的时候买入,从第5天价格为8的时候卖出,可以获得最大收益: 此时 ...

  6. LeetCode 121 Best Time to Buy and Sell Stock(股票买入卖出的最佳时间)

    翻译 话说你有一个数组,其中第i个元素表示在第i天的股票价格.如果你被只被允许最多一次交易(例如,买入然后卖出一个股票),设计一个算法并找出最大利润. 原文 Say you have an array ...

  7. LeetCode 122 Best Time to Buy and Sell Stock II(股票买入卖出的最佳时间 II)

    翻译 话说你有一个数组,其中第i个元素表示第i天的股票价格.设计一个算法以找到最大利润.你可以尽可能多的进行交易(例如,多次买入卖出股票).然而,你不能在同一时间来多次交易.(例如,你必须在下一次买入 ...

  8. 动态规划--股票(一次买入卖出和两次买入卖出)

    动态规划–股票(一次买入卖出和两次买入卖出)(c++) ##一次买入卖出 如果用一个数组代表股票每天的价格,可以选择从某一天买入,然后之后的一天卖出,求能够获得的最大收益. 例如,一只股票在某些时间节 ...

  9. 【面试】网易游戏面试题目整理及答案(3)

    网易游戏面试题目整理及答案(3) 数据库部分 MySQL 事务 MySQL锁机制 MySQL调优 MySQL分区.分表.分库 主从复制 其他问题 数据库部分 MySQL 事务 事务的隔离级别有哪些?M ...

最新文章

  1. 记录 Git命令速查表
  2. CentOs安装ssh服务
  3. [密码学基础][信息安全][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第11篇]DLP、CDH和DDH问题是什么?
  4. mac os touch命令_MacOS系统终端常用命令大全
  5. 旋转角度_LG推出新款显示器,可多角度旋转
  6. Salesforce 中获取数据表字段的 picklist 的值
  7. rar for android去广告,安卓RAR压缩器(RAR for Android) v5.50.42 去广告版
  8. linux下监控网络连接,Linux网络监控工具--netstat及网络连接分析
  9. java转动的风扇课程设计,课程设计—智能风扇设计报告
  10. js开源框架最新版下载
  11. 彻底解决乱码问题(一):为何会出现乱码
  12. Camera ISO、快门、光圈、曝光这几个概念
  13. 项目经理到底要不要考取PMP证书呢?
  14. Java 多线程(超详细)
  15. js escape、 unescape、 encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的区别
  16. RemObjects(一)客户端远程调用服务端接口过程
  17. 《计算机网络》期末试卷2020
  18. LoRa PHY CSS解调
  19. SSH远程登录执行命令脚本
  20. android文件选择器_支付宝小程序设计规范(内附PSD+Sketch源文件)

热门文章

  1. USB模块分析(四)- 设备列表权限申请
  2. 【SpringBoot】SPI 与 spring.factories
  3. linux里以第一列排序,Linux操作系统中排序命令Sort的使用方法
  4. arduino智能闹钟_有趣的Tick Tock智能闹钟了解一下~
  5. ABB机器人PCSDK使用(三)
  6. 华为AC-6605的License授权
  7. 如何查询域名是否备案,域名备案批量查询方法
  8. 解决GitHub下载速度太慢的问题,百分百有效
  9. 使用git下载项目到本地,指定本地文件夹位置的三种方式
  10. Java POI XSSF