zoukankan      html  css  js  c++  java
  • 【leetcode】Min Stack -- python版

    题目描述:

    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.

    解题思路:

    这个问题挺简单(确实leetcode给的评级也是easy),但是还真是遇上了不少的问题。
    首先,这道题目我们的想法是如何去做到这个特殊的getMin,想到的方法当然是空间换时间啦,那么用什么空间呢?当然是另一个栈啦,所以我们就有了这么一个想法:用另一个栈来记录当前最小值,那么查找最小值就不需要遍历了,这样就实现了时间复杂度和空间复杂度都是O(n)。的确这个想法已经很不错了,用java(官方题解就是这个版本)和C++(亲测)。但是我用python就MLE了,让我纠结了好久。
    所以在没办法就要优化内存了,这里采用的方法是在minStack中插值的时候对相同的值不重复插入,而是记录他的次数,终于AC

    MLE

     1 class MinStack:
     2     def __init__(self):
     3         self.stack = []
     4         self.minStack = []
     5     # @param x, an integer
     6     # @return an integer
     7     def push(self, x):
     8         self.stack.append(x)
     9         if len(self.minStack) == 0 or self.minStack[-1] >= x:
    10             #print 'minn change'
    11             self.minStack.append(x)
    12  
    13     # @return nothing
    14     def pop(self):
    15         p = self.stack.pop()
    16         #print 'pop ' , p
    17         if p == self.minStack[-1]:
    18             #print 'minn pop'
    19             self.minStack.pop()
    20 
    21     # @return an integer
    22     def top(self):
    23         return self.stack[-1]
    24 
    25     # @return an integer
    26     def getMin(self):
    27         return self.minStack[-1]

    AC

     1 class MinStack:
     2     def __init__(self):
     3         self.stack = []
     4         self.minStack = []
     5         #self.minStack.append(0)
     6     # @param x, an integer
     7     # @return an integer
     8     def push(self, x):
     9         self.stack.append(x)
    10         if len(self.minStack) == 0 or self.minStack[-1][0] > x:
    11             #print 'minn change'
    12             self.minStack.append((x,1))
    13         elif x == self.minStack[-1][0]:
    14             self.minStack[-1] = (x, self.minStack[-1][1] + 1)
    15  
    16     # @return nothing
    17     def pop(self):
    18         p = self.stack.pop()
    19         #print 'pop ' , p
    20         if p == self.minStack[-1][0]:
    21             if self.minStack[-1][1] > 1:
    22                 #print 'minn pop'
    23                 self.minStack[-1] = (self.minStack[-1][0], self.minStack[-1][1] - 1)
    24             else:
    25                 self.minStack.pop()
    26 
    27     # @return an integer
    28     def top(self):
    29         return self.stack[-1]
    30 
    31     # @return an integer
    32     def getMin(self):
    33         #print self.minStack
    34         return self.minStack[-1][0]
  • 相关阅读:
    思考
    创建Windows Mobile上兼容性好的UI 程序
    中文乱码(二)
    中文乱码(三)
    MySQL字符集产生乱码的简单讲解
    MySql乱码解决(五)
    中文乱码(四)
    mysql中文问题全处理
    Linux 中 x86 的内联汇编
    arm下的gcc内联汇编
  • 原文地址:https://www.cnblogs.com/MrLJC/p/4104709.html
Copyright © 2011-2022 走看看