题目(股票的最大利润)
假设把某股票的价格按时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。如果我们在价格为 5 的时候买入并在价格为 16 时卖出,则能获得最大的利润为 11。
算法思路
本题抽象出来就是,在不改变数组元素顺序的前提下,找到一对数对,他们的差值最大。
首先,由常识可知,在股票最低价的时候买入,最高价的时候卖出,最后所得的利润是最大的。
那么当我们买入第 i 个时间节点的股票时(此时相当于固定了卖出价),那么必须在之前的最低价格时买入,所以我们需要设置一个变量 min 记录 i 之前的最低价格(即 i 之前的最小数组元素)。当当前的价格小于 min,那么就更新 min 的值,否则就算出此时能够获得的利润,再将其与目前的最大利润比较,如果更大,则更新当前的最大利润。
算法实现
复杂度分析
算法仅遍历一次数组,时间复杂度为 O(n);空间复杂度为 O(1)。
参考
[1] <<剑指offer2>>