请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
知识回顾:1.队列queue中 :
add()
-
-
将指定的元素插入到此队列中,如果可以立即执行此操作,而不会违反容量限制,
true
在成功后返回IllegalStateException
如果当前没有可用空间,则抛出IllegalStateException
-
peek()
-
-
检索但不删除此队列的头,如果此队列为空,则返回
null
-
poll()
-
-
检索并删除此队列的头,如果此队列为空,则返回
null
。
-
2.双端队列dequeue中
addFirst()
-
-
插入此双端队列的前面
-
addLast()
-
-
在插入如果它是立即可行且不会违反容量限制,抛出此双端队列的末尾指定元素
IllegalStateException
如果当前没有空间可用。
-
peekFirst()
-
-
检索,但不删除,此deque的第一个元素,或返回
null
如果这个deque是空的。
-
peekLast()
-
-
检索但不删除此deque的最后一个元素,如果此deque为空,则返回
null
。
-
pollFirst()
-
-
检索并删除此deque的第一个元素,如果此deque为空,则返回
null
-
pollLast()
-
-
检索并删除此deque的最后一个元素,如果此deque为空,则返回
null
。
-
removeFirst() :
-
-
检索并删除此deque的第一个元素。
-
removeLast():
-
-
检索并删除此deque的最后一个元素
-
3. 栈Stack
push()
-
-
将项目推送到此堆栈的顶部。
-
pop()
-
-
删除此堆栈顶部的对象,并将该对象作为此函数的值返回。
-
peek()
-
-
查看此堆栈顶部的对象,而不从堆栈中删除它。
-
解题思路:求队列最大值相关题目考虑使用双端队列deque
1.push:每次入队时,如果deque队尾元素小于即将入队元素value时,则将小于value的元素全部出队,然后将value入队,这样可以保证deque中元素的有序性,其中对头元素就是所求的最大值。
2.pop:出队时,如果入队queue中队头元素等于deque的对头元素,则deque对头需要出队,并返回queue对头元素
3.max:deque中对头元素就是所求最大值。
class MaxQueue {
Deque<Integer> deque;
Queue<Integer> queue;
public MaxQueue() {
queue=new LinkedList<Integer>();
deque=new LinkedList<Integer>();
}
public int max_value() {
if(queue.isEmpty()){
return -1;
}
return deque.peekFirst();
}
public void push_back(int value) {
while(!deque.isEmpty() && value>deque.peekLast()){
deque.removeLast();
}
deque.addLast(value);
queue.add(value);
}
public int pop_front() {
if(queue.isEmpty()){
return -1;
}
//int res=queue.poll();
int res=queue.poll();
if(res==deque.peekFirst()){
deque.removeFirst();
}
return res;
}
}
/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue obj = new MaxQueue();
* int param_1 = obj.max_value();
* obj.push_back(value);
* int param_3 = obj.pop_front();
*/