716. Max Stack
by Botao Xiao
Question
Design a max stack that supports push, pop, top, peekMax and popMax.
push(x) – Push element x onto stack. pop() – Remove the element on top of the stack and return it. top() – Get the element on the top. peekMax() – Retrieve the maximum element in the stack. popMax() – Retrieve the maximum element in the stack, and remove it. If you find more than one maximum elements, only remove the top-most one.
Example 1:
MaxStack stack = new MaxStack();
stack.push(5);
stack.push(1);
stack.push(5);
stack.top(); -> 5
stack.popMax(); -> 5
stack.top(); -> 1
stack.peekMax(); -> 5
stack.pop(); -> 1
stack.top(); -> 5
Note:
- -1e7 <= x <= 1e7
- Number of operations won’t exceed 10000.
- The last four operations won’t be called when stack is empty.
Solutions
- Method 1: LinkedList + PriorityQueue
class MaxStack { private PriorityQueue<Integer> pq; private LinkedList<Integer> values; /** initialize your data structure here. */ public MaxStack() { this.pq = new PriorityQueue<>(new Comparator<Integer>(){ @Override public int compare(Integer a, Integer b){ return b - a; } }); this.values = new LinkedList<>(); } public void push(int x) { this.values.addFirst(x); this.pq.offer(x); } public int pop() { Integer first = this.values.pollFirst(); pq.remove(first); return first; } public int top() { return this.values.get(0); } public int peekMax() { return this.pq.peek(); } public int popMax() { Integer max = pq.poll(); this.values.remove(max); return max; } } /** * Your MaxStack object will be instantiated and called as such: * MaxStack obj = new MaxStack(); * obj.push(x); * int param_2 = obj.pop(); * int param_3 = obj.top(); * int param_4 = obj.peekMax(); * int param_5 = obj.popMax(); */
Subscribe via RSS