图解 | 剑指 Offer 59 - II. 队列的最大值
作者丨微木
来源丨编程狂想曲
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
输入:
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2] 思路分析 题目要求实现三个函数,分别是max_value、push_back和pop_front。对于push_back和pop_front这两个函数,我们可以直接调用相应的API来完成。初步的代码实现如下: 在看函数max_value如何实现之前。先思考一个问题:假设现在有5, 3, 4这几个数入队,然后在每个数入队之后,都要知道当前队列中的最大值,这个怎么实现呢?我们可以借助单调队列来实现,所谓的单调队列就是队列中元素从队首到队尾是单调递减或单调递增的。 首先,考察第一个元素5。此时队列为空,元素5入队。 然后,考察第二个元素3。由于3小于队尾元素5,将其入队。这时,队列中的元素从队首到队尾是单调递减的。 接着,考察第三个元素4。由于4大于队尾元素3,这时如果将4直接入队,那么队列中的元素从队首到队尾就不是单调递减的了。为了维持单调递减这个特性,需要将元素3出队,而这时出队,不是从队首移除,而是从队尾移除。对于这种,一端既可以入队又可以出队的队列,称为双向队列。 接着,将元素4入队。这时,队列中的元素从队首到队尾是单调递减的。 在明白了什么是单调递减队列后,函数max_value的实现就清晰了。我们可以新建一个辅助队列maxQueue,然后在获取最大值时,直接取maxQueue队首的元素就可以了。 这里有两点需要注意:
一是当有元素存入队列originQueue时,为了保持maxQueue的单调性,如果当前入队元素大于等于maxQueue队尾元素的最大值,那么就需要将maxQueue队尾元素出队,直到队列为空或者新的队尾元素大于入队元素;
二是在移除originQueue队首元素时,如果移除元素值等于maxQueue队首元素值,则需要将maxQueue队首元素出队,因为它已经不再队列originQueue中了。
-End-
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!
面试题
】即可获取评论