小白学算法:买卖股票的最佳时机!
今天蚂蚁集团(支付宝)正式上市了,毫无疑问这一举措又造就了一大批富豪,然而作为局外人的我们,也只有羡慕的份了。明明可以考运气吃饭,咱非得靠实力,你说冤不冤啊? 但话又说回来,能进蚂蚁的人也都是牛人,那咱也赶紧提升一下技能吧,好为下一个“蚂蚁”做足准备。 今天的这道题比较有意思,是关于「买卖股票」的,题目如下。 题目描述给定一个数组,它的第?i 个元素是一支给定股票第 i 天的价格。
示例 1:
示例 2:
解题思路根据题目的意思我们知道,我们只有一次交易的机会,也就是买一次再卖一次,但同时要保证收益最大化。那我们本能的直觉是在最低的价格买入,再在最高的价格卖出就好了,如下图所示: 但这有一个问题,就是我们要保证最高价格要在最低的价格之后,因为我们必须在购买了股票之后才能卖出,而不是相反的顺序,这就让问题变的复杂了。 但此刻我们想到了一个最直接也是最笨的一个方法,那就是用暴力穷举法,我们使用两层循环,依次在每个节点买入,然后再在之后的所有节点卖出,这样来计算节点间的差值(收益),如果此差值大于当前最高收益,就将此值设置为当前最高收益,这样循环完,我们就能获得最大收益了。如下图所示: 方法一:暴力法有了上面的思路,接下来我们用代码实现一下:
可以看出代码还是很简单的,但别高兴得太早,我们来看它在 leetcode 上的表现: 复杂度分析
真是一顿操作猛如虎,最终击败百分之五!如果用这种代码去面试的话,估计只能回去等通知了。那有没有更好的方法呢?答案是肯定的,继续往下看。 方法二:遍历一次对于这道题我们其实可以使用一次循环来实现,先来看下面的这张折线图: 从上面的图片我们可以看出,我们在每个节点其实只会做两件事(第一个节点除外,只能买入不能卖出),这两件事分别是:买入或卖出。那么我们其实可以用一个循环来计算出最大的利润,我们只需要依次对于每个节点做以下两个判断:
这样循环完成之后最高收益就出来了,实现代码如下:
以上代码在 leetcode 中的结果如下图所示: @H_403_133@ 复杂度分析
从以上的执行的结果可以看出,这段代码还算是比较理想的,这样面试官也会对你竖起大拇指了。 总结本文我们计算了单次(一次买入和卖出)股票的最高收益,刚开始我们使用的是最简单粗暴的暴力枚举法,使用两层循环依次相减来求出最高收益值,但这种方法的执行效率太低。 然后我们经过观察折线图发现,只需要一次循环也能找出最高的收益值。我们只需要在每个节点做两个判断,第一:判断此节点是否为相对最小值,如果是,则记录下来;如果不是,则计算此值和相对最小值是否为当前最高收益,如果是,则记录下来。那么循环一圈之后,我们就能得出最高的收益了,并且执行的效率也很高。 你学会了吗?有不懂的地方或者更好的方法,欢迎评论区留言~ (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |