FNSY

716. Max Stack

May 8th, 2022
786
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.91 KB | None | 0 0
  1. class Node {
  2.     int val;
  3.     Node next, prev;
  4.    
  5.     Node(int val) {
  6.         this.val = val;
  7.     }
  8. }
  9.  
  10. class MaxStack {
  11.  
  12.     Node head, tail;
  13.    
  14.     TreeMap<Integer, ArrayList<Node>> maxs;
  15.    
  16.     public MaxStack() {
  17.         head = new Node(-1);
  18.         tail = new Node(-1);
  19.         head.next = tail;
  20.         tail.prev = head;
  21.         maxs = new TreeMap<>();
  22.     }
  23.    
  24.     private void insertNode(Node node) {
  25.         Node next = head.next;
  26.         head.next = node;
  27.         node.next = next;
  28.         next.prev = node;
  29.         node.prev = head;
  30.     }
  31.    
  32.     public void push(int x) {
  33.         Node node = new Node(x);
  34.         if (!maxs.containsKey(x)) maxs.put(x, new ArrayList<>());
  35.         insertNode(node);
  36.         maxs.get(x).add(node);
  37.     }
  38.    
  39.     private void removeNode(Node node) {
  40.         Node prev = node.prev;
  41.         Node next = node.next;
  42.         prev.next = next;
  43.         next.prev = prev;
  44.         node.next = null;
  45.         node.prev = null;
  46.         List<Node> list = maxs.get(node.val);
  47.         maxs.get(node.val).remove(list.size() - 1);
  48.         if (maxs.get(node.val).isEmpty()) maxs.remove(node.val);
  49.     }
  50.    
  51.    
  52.     public int pop() {
  53.         Node popNode = head.next;
  54.         int pop = popNode.val;
  55.         removeNode(popNode);
  56.         return pop;
  57.     }
  58.    
  59.     public int top() {
  60.         return head.next.val;
  61.     }
  62.    
  63.     public int peekMax() {
  64.         return maxs.lastEntry().getKey();
  65.     }
  66.    
  67.     public int popMax() {
  68.         List<Node> list = maxs.lastEntry().getValue();
  69.         Node popNode = list.get(list.size() - 1);
  70.         removeNode(popNode);
  71.         return popNode.val;
  72.     }
  73. }
  74.  
  75. /**
  76.  * Your MaxStack object will be instantiated and called as such:
  77.  * MaxStack obj = new MaxStack();
  78.  * obj.push(x);
  79.  * int param_2 = obj.pop();
  80.  * int param_3 = obj.top();
  81.  * int param_4 = obj.peekMax();
  82.  * int param_5 = obj.popMax();
  83.  */
Advertisement
Add Comment
Please, Sign In to add comment