zoukankan      html  css  js  c++  java
  • Min Stack

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

        push(x) -- Push element x onto stack.
        pop() -- Removes the element on top of the stack.
        top() -- Get the top element.
        getMin() -- Retrieve the minimum element in the stack.

    分析:

    要求实现一个栈,支持O(1)时间的取最小元素操作。

    我用了很简单的办法来做,导致pop()的时间复杂度为O(n),应该有更好的方式,但是我没有想到时间少于O(logN)的解决方案,先提交代码也Accepted了。

    class MinStack:
        # @param x, an integer
        # @return an integer
    
        def __init__(self):
            self.stack = []
            self.min = None
    
        def push(self, x):
            if not self.min or x < self.min: self.min = x
            self.stack.append(x)
    
        # @return nothing
        def pop(self):
            i = self.stack.pop()
            if len(self.stack) == 0:
                self.min = None
            elif i == self.min:
                self.min = min(self.stack)
    
        # @return an integer
        def top(self):
            return self.stack[-1]
    
        # @return an integer
        def getMin(self):
            return self.min

    小结:

    leetcode上有关于这个问题的解答,需要考虑一下才能明白,下面代码所有操作的时间复杂度都是O(1):

    class MinStack:
        # @param x, an integer
        # @return an integer
    
        def __init__(self):
            self.stack = []
            self.min = []
    
        def push(self, x):
            self.stack.append(x)
            if len(self.min) == 0 or x <= self.min[-1]:
                self.min.append(x)
    
        # @return nothing
        def pop(self):
            if len(self.stack) > 0:
                if self.stack.pop() == self.min[-1]:
                    self.min.pop()
    
        # @return an integer
        def top(self):
            return self.stack[-1]
    
        # @return an integer
        def getMin(self):
            return self.min[-1]

    在算法的思考方面我还需要磨练,多做题是个不错的锻炼方式,有进步就好。但是最近工作很忙,要学习的框架和技术很多,实在没有多余的精力来阅读和写作。鱼与熊掌不可兼得。

  • 相关阅读:
    蓝桥杯--算法训练 区间k大数查询
    vijos1782:借教室
    vijos1779国王游戏
    C++大数模板
    HDU1042(N!:设4为基数)
    HDU1026(延时迷宫:BFS+优先队列)
    POJ3984(迷宫问题)
    HDU3018:Ant Trip(欧拉回路)
    HDU5438:Ponds(拓扑排序)
    2008北航:字符串匹配
  • 原文地址:https://www.cnblogs.com/openqt/p/4100392.html
Copyright © 2011-2022 走看看