有一道堆栈相关算法题,我被面试过两次以上,看似其在算法面试中出现的概率很高,由此值得我们好好分析下。题目是这样的:
对于堆栈的常用操作有, pop 弹出堆栈顶部的元素;push 向堆栈压入一个元素;peek 获得堆栈顶部的元素值,但不弹出堆栈。现在要去你增加一个操作max, 它的作用是返回堆栈当前所有元素中值最大的那个,例如堆栈当前元素有:
stack: 5,4,2,3
那么max() 返回的值就是5. 假设向堆栈继续推入元素后,情况如下:
stack: 5, 4, 2, 3, 6, 1, 10, 8
那么调用max() 得到的元素为10.
假设我们现在我们采取pop操作,弹出顶部两个元素,那么堆栈情况如下:
stack: 5, 4, 2, 3, 6, 1
显然此时max 操作返回的元素是6。
请给出一个时间复杂度为O(1)的算法,实现max操作。
这道题一个麻烦处在于,如果堆栈仅仅是压入元素,那么返回最大值是很容易的,只要把当前压入元素的最大值记下来就可以了。问题在于,堆栈还有弹出操作,当弹出后,堆栈当前的最大元素可能就会不断的发生变化。如果是压入操作和弹出操作交替进行的话,那么情况就更复杂了。
解决这个问题的算法如下:
1, 每次压入元素是,用一个变量maxVal, 记录堆栈当前元素的最大值。
2, 创建一个新堆栈maxStack,当压入元素的值大于当前元素的最大值时,把该元素压入maxStack.
3,