Problem
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
Implement the MinStack class:
- MinStack() initializes the stack object.
- void push(int val) pushes the element val onto the stack.
- void pop() removes the element on the top of the stack.
- int top() gets the top element of the stack.
- int getMin() retrieves the minimum element in the stack.
Algorithm
Use heap to implement.
Code
class MinStack(object):
def __init__(self):
self.size = 0
self.heap = []
self.index = []
self.position = []
def push(self, x):
self.heap.append(x)
self.index.append(self.size)
self.position.append(self.size)
self.size += 1
Now = self.size - 1
while Now:
New = (Now - 1) // 2
if self.heap[self.index[New]] > self.heap[self.index[Now]]:
self.position[self.index[New]] = Now
self.position[self.index[Now]] = New
buf_index = self.index[New]
self.index[New] = self.index[Now]
self.index[Now] = buf_index
Now = New
else: break
def pop(self):
if 0 == self.size:
return None
self.size -= 1
if not self.size or self.position[self.size] == self.size:
self.index.pop()
self.position.pop()
return self.heap.pop()
Now = self.position[self.size]
self.position[self.index[self.size]] = Now
self.index[Now] = self.index[self.size]
while Now < self.size:
L = Now * 2 + 1
R = Now * 2 + 2
New = Now
if L < self.size and self.heap[self.index[L]] < self.heap[self.index[New]]:
New = L
if R < self.size and self.heap[self.index[R]] < self.heap[self.index[New]]:
New = R
if Now != New:
self.position[self.index[New]] = Now
self.position[self.index[Now]] = New
buf_index = self.index[New]
self.index[New] = self.index[Now]
self.index[Now] = buf_index
Now = New
else: break
self.index.pop()
self.position.pop()
return self.heap.pop()
def top(self):
return self.heap[self.index[self.position[self.size-1]]]
def getMin(self):
if 0 == self.size:
return None
else:
return self.heap[self.index[0]]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()