716. Max Stack (follow up questions for min stack)
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.
1. Solution: add popmax this func, you can pop out max at any time , so max stack to track the max elements does not work as minstack(leetcode 155) did
add one more stack for helping
1. pop out the ele in the origin stack until find the max
2. push all into temp stack
3. use push(self built func) to push all the ele from temp stack into original stack
class MaxStack { //becasuse of popMAx, two stacks is not enough List<Integer> s1 ;//store ele List<Integer> s2 ;//store min ele /** initialize your data structure here. */ public MaxStack() { s1 = new ArrayList<Integer>(); s2 = new ArrayList<Integer>(); } public void push(int x) { s1.add(x); if(s2.isEmpty() || s2.get(s2.size()-1) <= x) s2.add(x); } public int pop() { if(s1.isEmpty()) return 0; int ele = s1.remove(s1.size()-1); if(!s2.isEmpty() && ele == s2.get(s2.size()-1)){ s2.remove(s2.size()-1); } return ele; } public int top() { if(!s1.isEmpty()) return s1.get(s1.size()-1); return 0; } public int peekMax() { if(!s2.isEmpty()) return s2.get(s2.size()-1); return 0; } //handful problem public int popMax() { //pop max if(!s1.isEmpty() && !s2.isEmpty()){ int ele = s2.remove(s2.size() - 1); List<Integer> s3 = new ArrayList<>(); while(ele != s1.get(s1.size() - 1)){ int temp = s1.remove(s1.size() - 1); s3.add(temp); } s1.remove(s1.size() - 1); while(!s3.isEmpty()){ push(s3.remove(s3.size()-1)); } return ele; } return 0; } } /** * 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(); */
2. solution 2: https://leetcode.com/problems/max-stack/discuss/153748/Java-LinkedList-and-PriorityQueue (using linkedlist and priorityQueue)
Leave a comment u have a question!