一、题目
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
二、示例
2.1> 示例 1:
【输入】 [7,1,5,3,6,4]
【输出】 5
【解释】 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
2.2> 示例 2:
【输入】 [7,6,4,3,1]
【输出】 0
【解释】 在这种情况下, 没有交易完成, 所以最大利润为 0。
限制:
0
<= 数组长度 <=10^5
三、解题思路
- 根据题目描述,只买卖一次股票,那么可以获得最大利润时多少?既然要获得最大的利润,那么一定是在某个有效的时间区间内购买的股票价格最低,而卖出的股票价格最高。
- 通过方法入参的数组
prices
中,是按照时间先后顺序进行排序,那么其中的一个约束点就是时间了,即:最低点的股票购买时间点一定要在卖出的股票最高点之前,这样才算是一个有效的时间区间。那么,当我们遍历数组prices
的时候,只要找到了一个价格低点min
时,它后面所有的股票价格时间都是晚于它的,那么就可以通过计算每个价格与价格低点的差值,然后将利润最大的暂时保存在result
变量中。 - 那么当我们发现出现了更低价格的时候,
min
的值将被更新,然后再继续向后遍历对比利润值。直到数组prices
数组中所有的元素都被遍历一遍之后,result
变量的值,就是只买卖一次股票,可以获得的最大利润。
四、代码实现
classSolution { publicintmaxProfit(int[] prices) { if (prices.length==0) return0; intmax=0, min=prices[0]; for (inti=1; i<prices.length; i++) { min=Math.min(min, prices[i]); max=Math.max(max, prices[i] -min); } returnmax; } }
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」