题目
维护一个队列,同时提供一个函数输出最大值。
方法一
正常的队列,增加一个max()
函数,遍历队列的每一个元素,返回最大值。
O(n)
注意:不能使用一个额外的变量记录最大值,因为如果最大值被弹出,那么下一个最大值不知道是谁
方法二
使用二叉堆,最大二叉堆。
堆顶维护最大值。同时,每个节点,保存一个next
节点,表示在队列中的位置。
再额外的保存一个指针cur
,指向队列的头部。
A->B->C->D
A是最早被添加的信息,cur
指向A,pop之后指向B。
然后将ABCD使用最大二叉堆来存放。
最大值可以在O(1)内完成,但是删除和添加O(logN)
方法三
改进栈结构,栈中在维护一个栈,保存最大值信息,push时更新最大值,pop时判断最大值是否被pop出,因为是栈结构,因此,栈顶元素永远先于栈底的出。
然后使用两个两个栈结构来实现队列。
最大值max(),就返回两个栈中维护最大值信息栈的栈顶元素较大的那个。
注意:使用常规的队列,保存一个栈来记录最大值。push时,更新栈,压入更大的值。pop时,判断最大值是否出栈。这种方法也不行
网友评论