Max Stack — LeetCode 716 Python Solution
HardLeetCode PremiumStackDesignLinked ListDoubly-Linked ListOrdered Set
- Problem
- #716
- Pattern
- Linked List
- Reading time
- 12 min
- Source
- leetcode.com
The problem
Design a max stack data structure that supports the stack operations and supports finding the stack's maximum element. Implement the MaxStack class: MaxStack() Initializes the stack object.
Example
- Input
- ["MaxStack", "push", "push", "push", "top", "popMax", "top", "peekMax", "pop", "top"]
- Output
- [null, null, null, null, 5, 5, 1, 5, 1, 5]
- Explanation
- MaxStack stk = new MaxStack();
Python solution
Python
class Node:
def __init__(self, val=0):
self.val = val
self.prev: Union[Node, None] = None
self.next: Union[Node, None] = None
class DoubleLinkedList:
def __init__(self):
self.head = Node()
self.tail = Node()
self.head.next = self.tail
self.tail.prev = self.head
def append(self, val) -> Node:
node = Node(val)
node.next = self.tail
node.prev = self.tail.prev
self.tail.prev = node
node.prev.next = node
return node
@staticmethod
def remove(node) -> Node:
node.prev.next = node.next
node.next.prev = node.prev
return node
def pop(self) -> Node:
return self.remove(self.tail.prev)
def peek(self):
return self.tail.prev.val
class MaxStack:
def __init__(self):
self.stk = DoubleLinkedList()
self.sl = SortedList(key=lambda x: x.val)
def push(self, x: int) -> None:
node = self.stk.append(x)
self.sl.add(node)
def pop(self) -> int:
node = self.stk.pop()
self.sl.remove(node)
return node.val
def top(self) -> int:
return self.stk.peek()
def peekMax(self) -> int:
return self.sl[-1].val
def popMax(self) -> int:
node = self.sl.pop()
DoubleLinkedList.remove(node)
return node.val
# Your MaxStack object will be instantiated and called as such:
# obj = MaxStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.peekMax()
# param_5 = obj.popMax()Complexity
| Measure | Complexity |
|---|---|
| Time | O(n) |
| Space | O(n) auxiliary |
Pattern: Linked List
Rewire pointers in place, with a dummy head and a saved next to keep it safe. LeetCode 716. Max Stack is filed here because LeetCode tags it Linked List and Doubly-Linked List, which is the vocabulary this hub collects.
The linked list guide has the Python template for the pattern and the 75 LeetCode problems that use it.
Related problems
Frequently asked questions
- How hard is LeetCode 716. Max Stack?
- LeetCode 716. Max Stack is rated Hard on LeetCode.
- What is the time complexity of LeetCode 716. Max Stack?
- The Python solution on this page runs in O(n).
- What is the space complexity of LeetCode 716. Max Stack?
- The Python solution on this page uses O(n) auxiliary space.
- What topics does LeetCode 716. Max Stack cover?
- LeetCode 716. Max Stack is tagged Stack, Design, Linked List, Doubly-Linked List and Ordered Set on LeetCode.
- Is LeetCode 716. Max Stack a premium problem?
- Yes. LeetCode 716. Max Stack is a LeetCode Premium problem, so the full statement and test cases require a paid LeetCode subscription.