Leetcode 155. Min Stack

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值