【Java】 剑指offer(63) 股票的最大利润
本文参考自《剑指offer》一书,代码采用Java语言。
题目
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5,7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。
思路
遍历每一个数字,并保存之前最小的数字,两者差最大即为最大利润。
值得注意的是,我自己一开始写的代码是默认不能亏本(即可以不买入卖出,利润不能为负数),所以比较简单;但如果可以亏本,最大利润指的是最小的亏损,那么要注意最小数字不能是最后一个。在下面的代码中可以注意比较两种情况的差别。可以考虑的例子如 { 16, 11, 7, 4, 2, 1 }
测试算例
1.功能测试(数组递增/递减/无序)
2.特殊测试(null,空数组)
3.边界值测试(数组仅两个数字)
Java代码
//题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股
//票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5,
//7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能
//收获最大的利润11。 public class MaximalProfit {
public static int MaxDiff(int[] arr) {
if(arr==null || arr.length<2)
return -1; //error
int min=arr[0]; //最大利润可以是负数,只要亏损最小就行
int maxDiff=arr[1]-min;
for(int i=1;i<arr.length;i++) {
if(arr[i-1]<min) //保存“之前”最小数字
min=arr[i-1];
if(arr[i]-min>maxDiff)
maxDiff=arr[i]-min;
} //默认不能亏本,代码简单,上面复杂的代码注意细节
// int maxDiff=0;
// for(int i=1;i<arr.length;i++) {
// if(arr[i]<min)
// min=arr[i];
// else if(arr[i]-min>maxDiff)
// maxDiff=arr[i]-min;
// }
return maxDiff;
} //简单快速测试下
public static void main(String[] args) {
int[] arr1=null;
System.out.println(MaxDiff(arr1)==-1); int[] arr2={ };
System.out.println(MaxDiff(arr2)==-1); int[] arr3={ 16, 16, 16, 16, 16 };
System.out.println(MaxDiff(arr3)==0); int[] arr4={ 1, 2, 4, 7, 11, 16 };
System.out.println(MaxDiff(arr4)==15); int[] arr5={ 16, 11, 7, 4, 2, 1 };
System.out.println(MaxDiff(arr5)==-1); int[] arr6={ 9, 11, 5, 7, 16, 1, 4, 2 };
System.out.println(MaxDiff(arr6)==11); int[] arr7={ 2,4};
System.out.println(MaxDiff(arr7)==2); int[] arr8={ 4,2};
System.out.println(MaxDiff(arr8)==-2);
}
}
true
true
true
true
true
true
true
true
MaximalProfit
收获
1.蛮力法时间复杂度为O(n^2),肯定不对。我们从头到尾遍历,确定规律。可以发现找出之前的最小值即可。
【Java】 剑指offer(63) 股票的最大利润的更多相关文章
- 剑指 Offer 63. 股票的最大利润 + 动态规划
剑指 Offer 63. 股票的最大利润 Offer_63 题目描述 方法一:暴力法 package com.walegarrett.offer; /** * @Author WaleGarrett ...
- 剑指offer——73股票的最大利润
题目: 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}.如果我们能在价格为5 ...
- 剑指Offer 63. 数据流中的中位数(其他)
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...
- [剑指Offer] 63.数据流中的中位数
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. c ...
- LeetCode:“剑指 Offer”
LeetCode:"剑指 Offer" 刷题小菜鸡,花了几天时间做了一遍 LeetCode 上给出的 "剑指 Offer" 在此做一下记录 LeetCode主页 ...
- 剑指offer二刷(精刷)
剑指 Offer 03. 数组中重复的数字 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次. ...
- LeetCode—剑指 Offer学习计划
第 1 天 栈与队列(简单) 剑指 Offer 09. 用两个栈实现队列 class CQueue { public: CQueue() { } stack<int>s1,s2; void ...
- 剑指Offer (汇总)
刷完剑指Offer很久了,前几天想起来去年开通的博客园,正好把刷题笔记整理一下 刷题平台:牛客网 刷题语言:Python **链表(8道)** [剑指Offer 3. 从尾到头打印链表 (链表)](h ...
- 【剑指offer】(第 2 版)Java 题解
[剑指offer](第 2 版)Java 题解 第一章 面试的流程 略... 第二章 面试需要的基础知识 面试题 1. 赋值运算符函数 面试题 2. 实现 Singleton 模式 Solution ...
随机推荐
- APR欺骗
ARP欺骗简介 ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据监听.篡改.重放.钓鱼等攻 ...
- 完整版ffmpeg使用情况
protected void Page_Load(object sender, EventArgs e) { string filePath = @"D:/Prjects/MT147/exa ...
- JavaScript之正方教务系统自动化教评[插件-转载]
[声明]本插件系学院学长原创,非博主所创,发布此处,仅供学习和效仿. /** * @name:正方教务系统自动化教评-插件 * * @author:chenzhongshu * @date:2017- ...
- Ubuntu16.04搭建QingdaoU(docker一键式部署)
QDUOJ已经开源到2.0版本了,下面的教程不再适用,仅做纪念吧! 这几天装什么Linux.开源OJ上瘾了...竟然没去刷题...嗯,做好记录就写题啦! 先上原始网站的图: 风格不错,很符合我的口味. ...
- [CQOI2012]组装 (贪心)
CQOI2012]组装 solution: 蒟蒻表示并不会模拟退火,所以用了差分数组加贪心吗.我们先来看题: 在数轴上的某个位置修建一个组装车间 到组装车间距离的平方的最小值. 1<=n< ...
- MHA-Failover可能遇到的坑
一.主从数据一致性 1.1.如何保证主从数据一致性 参考叶师傅文章:FAQ系列 | 如何保证主从复制数据一致性 在MySQL中,一次事务提交后,需要写undo.写redo.写binlog,写数据文件等 ...
- uboot 如何向内核传递参数
a.uboot 向内核传递的参数有两种类型 1.一个是bootargs 2.一个是环境参数, 而环境参数的设置靠的是 Y:\junda\JdLinuxApp\A1801_uboot\source\u- ...
- freeRTOS中文实用教程6--错误排查
1.前言 本章主要是为刚接触FreeRTOS 的用户指出那些新手通常容易遇到的问题.这里把最主要的篇幅放在栈溢出以及栈溢出侦测上 2.printf-stdarg.c 当调用标准C 库函数时,栈空间使用 ...
- SVN设置必须锁定
SVN是一个开放源代码的版本控制系统,相信做开发的基本上都用过,这里就不多介绍了.团队协作开发时常常会出现提交的文档互相冲突的问题,这里给大家介绍一下给SVN文件设置必须锁定的方法,当然你也可以对冲突 ...
- 超级wifi
超级wifi (super wi-fi)是相对于现有的wifi提出的改进版,执行响应的 802.11af标准. 802.11af 标准是2014年2月提出的,它的主要特点是"建议在电视频率之 ...