注意:getMin()时间复杂度为O(1)

最原始的方法:

class MinStack(object):

    def __init__(self):
"""
initialize your data structure here.
"""
self.stack=[] def push(self, x):
"""
:type x: int
:rtype: void
"""
# self.stack.push(x) #无push函数,push操作是用append()函数实现
self.stack.append(x) def pop(self):
"""
:rtype: void
"""
self.stack.pop() #直接弹出最顶层元素 def top(self):
"""
:rtype: int
"""
return self.stack[-1] def getMin(self):
"""
:rtype: int
"""
# return min(self.stack())
return min(self.stack)

可惜min()函数太慢

思路1:

使用2个栈,栈1记录进来的数,栈2记录目前的最小值。当有新数push进来的时候,如果栈2为空或者这个数小于栈2顶上的值,就把这个数推入栈2。当pop的数正好等于最小值时,说明当前栈内的最小值变化了,要弹出这个最小值,记录的下一个最小值来到栈顶。

栈2始终记录着栈1的当前最小值,故pop,push操作时也要一并考虑。

class MinStack(object):

    def __init__(self):
"""
initialize your data structure here.
"""
self.stack=[]
self.min_stack=[] def push(self, x):
"""
:type x: int
:rtype: void
"""
self.stack.append(x)
# if self.min_stack==[] or x < self.min_stack[-1]
if len(self.min_stack) == 0 or x <= self.min_stack[-1]:
self.min_stack.append(x) def pop(self):
"""
:rtype: void
"""
if self.stack[-1]==self.getMin(): #函数前要带self
self.min_stack.pop()
return self.stack.pop() def top(self):
"""
:rtype: int
"""
return self.stack[-1] def getMin(self):
"""
:rtype: int
"""
return self.min_stack[-1]

运行时间降到了60ms 。    

时间复杂度分析:

getMin()和top()都是O(1).

思路2:

只使用1个栈,用一个变量min_val记录当前的最小值,将当前最小值一同入栈,为节省空间,仅在当前最小值更改时才入栈。所以该栈的push和pop实际上可能是两次。当新进来的数小于min_val时,把当前的min_val和新进来的数一起推入到栈,min_val变为这个新进来的数。当pop栈顶元素的时候,如果栈顶元素的值和min_val相等,那么就把它下面记录的之前最小值赋给min_val并弹出。

class MinStack(object):

    def __init__(self):
self.min = 2147483647
self.stack = [] def push(self, x):
if x <= self.min:
self.stack.append(self.min)
self.min = x
self.stack.append(x) def pop(self):
peak = self.stack.pop()
if peak == self.min:
self.min = self.stack.pop() def top(self):
return self.stack[-1] def getMin(self):
return self.min

不过此方法会出现重复值。

思路3:

也是使用1个栈,但栈中存的是当前值与最小值的差,用一个元素来记录,然后根据这个值可以计算出当前值和最小值。当栈顶元素为正时,表示当前元素比最小元素大,当前值为最小值+差值;当栈顶元素为负时,其表示的是当前元素值比之前最小值小,现在的最小值就是元素值。

class MinStack(object):

    def __init__(self):
self.min = 2147483648
self.stack = [] def push(self, x):
if not self.stack:
self.min = x
self.stack.append(x - self.min)
if x < self.min:
self.min = x def pop(self):
peak = self.stack.pop()
if peak < 0:
self.min = self.min - peak def top(self):
if self.stack[-1] < 0:
return self.min
else:
return self.min + self.stack[-1] def getMin(self):
return self.min

[LeetCode] 155. minStack 设计最小栈的更多相关文章

  1. [LeetCode] 155. Min Stack 最小栈

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

  2. 【LeetCode】155. Min Stack 最小栈 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 栈同时保存当前值和最小值 辅助栈 同步栈 不同步栈 日期 题目地 ...

  3. 155 Min Stack 最小栈

    设计一个支持 push,pop,top 操作,并能在常量时间内检索最小元素的栈.    push(x) -- 将元素x推入栈中.    pop() -- 删除栈顶的元素.    top() -- 获取 ...

  4. [LeetCode] 0155. Min Stack 最小栈 & C++Runtime加速

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

  5. leetcode算法学习----155. 最小栈(MinStack )

    下面题目是LeetCode算法155题: https://leetcode.com/problems/min-stack/ 题目1:最小函数min()栈 设计一个支持 push,pop,top 操作, ...

  6. LeetCode 155:最小栈 Min Stack

    LeetCode 155:最小栈 Min Stack 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- ...

  7. LeetCode初级算法--设计问题02:最小栈

    LeetCode初级算法--设计问题02:最小栈 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  8. Java实现 LeetCode 155 最小栈

    155. 最小栈 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) – 将元素 x 推入栈中. pop() – 删除栈顶的元素. top() – 获取 ...

  9. 【LeetCode】155. 最小栈

    155. 最小栈 知识点:栈:单调 题目描述 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删 ...

随机推荐

  1. Jmeter中模拟多用户执行多场景操作

    1.其实一个用户组就是一个场景(Thread Group).可以在一个测试计划中进行多个场景的执行,在测试计划下加一个全局的User Defined Variables,在这个里面可以设置执行总数to ...

  2. Kendo UI diagram 更改connnect线颜色,及shapes的属性值

    1.改diagram中连线的颜色:redraw一下就OK // Change the Line Green diagram.connections[indexS].redraw({ stroke:{ ...

  3. web自动化-selenium2入门讲解(mac版本)

    最近要做一个selenium2的分享,于是总结了下我用selenium2的感受,希望分享出来,可以对入门的小伙伴有一点帮助,也希望得到大佬的指教   一,环境搭建maven+selenium2+tes ...

  4. css font-family 字体组

    介绍图片来自: http://www.runoob.com/cssref/css-websafe-fonts.html

  5. cmake模板

    1.主要命令 project (TEST):指定项目名称为TEST aux_source_directory(<dir> <variable>):将当前目录中的源文件名称赋值给 ...

  6. hive初体验

    --创建表 create table t_order(id int,name string,phone string) row format delimited fields terminated b ...

  7. 前后端分离开发,跨域访问的apche设置

    1,如何让Apache支持跨域访问呢? 步骤: 修改httpd.conf,windows中对应的目录是:C:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf 把 ...

  8. JDBC、事务和连接池

    一:JDBC 1.什么是JDBC JDBC(Java Data Base Connectivity)SUN公司提供的一套操作数据库的标准规范.具体来讲是一种用于执行SQL语句的Java API,为多种 ...

  9. HDU 3240

    求卡特兰数前N项的和模M. 直接求必定是不可能的,卡特兰数太大了.想了好久,本打算把位数拆成素数相乘,然后记录下各素数的个数计算.可惜,TLE....因为N太大了. 除法必定是要用到逆元的,但分母与M ...

  10. [博弈] hdu 3683 Gomoku

    题意: 两个人下五子棋.给你现有棋盘,推断在三步之内的胜负情况. 输出分为几种. 1.棋盘不合法 2.黑或白在第一步赢下在(x,y)点,多个输出x最小的.y最小的. 3.输在第二步 4.黑或白在第三步 ...