😲716 Max Stack

https://leetcode.com/problems/max-stack/

class MaxStack {
    private class Node {
        int val;
        Node pre;
        Node next;
        public Node(int val) {
            this.val = val;
            pre = null;
            next = null;
        }
    }
    private TreeMap<Integer, Deque<Node>> map;
    private Node head;
    private Node tail;
    public MaxStack() {
        map = new TreeMap<>();
        head = new Node(-1);
        tail = new Node(-1);
        head.next = tail;
        tail.pre = head;
    }
    
    public void push(int x) {
        Deque<Node> stack = map.get(x);
        if (stack == null) {
            stack = new ArrayDeque<>();
        }
        Node node = new Node(x);
        insert(node);
        stack.offerFirst(node);
        map.put(x, stack);
    }
    
    public int pop() {
        Node node = head.next;
        int val = node.val;
        Deque<Node> stack = map.get(val);
        stack.pollFirst();
        if (stack.isEmpty()) {
            map.remove(val);
        }
        remove(node);
        return val;
    }
    
    public int top() {
        Node node = head.next;
        return node.val;
    }
    
    public int peekMax() {
        int key = map.lastKey();
        Deque<Node> stack = map.get(key);
        return stack.peekFirst().val;
    }
    
    public int popMax() {
        int key = map.lastKey();
        Deque<Node> stack = map.get(key);
        Node node = stack.pollFirst();
        if (stack.isEmpty()) {
            map.remove(key);
        }
        remove(node);
        return node.val;
    }
    
    private void insert(Node node) {
        Node next = head.next;
        head.next = node;
        node.pre = head;
        node.next = next;
        next.pre = node;
    }
    private void remove(Node node) {
        if (node.next == null || node.pre == null) {
            return;
        }
        Node pre = node.pre;
        Node next = node.next;
        pre.next = next;
        next.pre = pre;
        
        node.next = null;
        node.pre = null;
    }
}

/**
 * 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();
 */

类似LRU,利用双向链表和treeMap,treeMap可以快速找到最大的key(lastKey),链表可以快速insert和remove,同时还保证顺序

Last updated