来自:剑指offer 59题
【题目】 请定义一个队列并实现函数max得到队列里的最大值,要求函数max、push_back和pop_front的时间复杂度都是o(1)。
【分析】 前面我们做过一个o(1)时间内返回栈内最大或最小元素的题目。就是使用了两个栈,第二个栈维护这前n个元素的最小值,当出栈的时候最小值也跟着出栈。
我们这里也一样,使用两个队列,一个是存放数值,这样本身入队和出队的时间是o(1)。而另一个栈,存放剩余元素的最小值。 比如:
上面是数值队列,下面是最大值队列。最大值队列中维护的是,当前队列中的最大值。 但是怎么维护呢?比如来了一个数字6.5。那么就应该变成: 其实也不难。就是单调队列该了一下,如果当前元素i比队尾元素大,则队尾元素出栈,并计数。最后出去几个元素就进去几个i。
第一个队列使用普通的队列就行,第二个队列因为要从后面出元素,所以使用双端队列。
【代码】
//MyQueue.java
Test.java
结果:
|