您的位置:首页 > 其它

LeetCode#155 Min Stack

2015-07-20 20:46 302 查看
Problem Definition:

  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.

Sulotion 1:一个附加栈来存储最小值。只存储那些新的最小值;每次pop都要检查,如果出栈元素与附加栈栈顶元素相同,附加栈也pop。

class MinStack:

def __init__(self):
self.nums=[]
self.min=[sys.maxint]

def push(self, x):
self.nums+=x,    #一点小trick,x转成tuple,相当于append(x)
if x<=self.min[len(self.min)-1]:#注意,重复的min也要进栈
self.min+=x,

def pop(self):
p=self.nums.pop()
if p==self.min[len(self.min)-1]:
self.min.pop()

def top(self):
return self.nums[len(self.nums)-1]

def getMin(self):
return self.min[len(self.min)-1]


这种以空间-时间tradeoff的方法很普通,下面来看一种酷炫的实现,常数空间复杂度:

Solution 2:

class MinStack:

def __init__(self):
self.min = sys.maxint
self.diffs = []

def push(self, x):
self.diffs += x - self.min,
self.min = min(self.min, x)

def pop(self):
diff = self.diffs.pop()
self.min -= min(diff, 0)

def top(self):
return self.min + max(self.diffs[-1], 0)

def getMin(self):
return self.min


Now let's see the tricks here:

1)diffs数组里保存的是元素进栈时与当时的最小值的差,这个差可能为正可能为负;min记录的则是当前的最小值。

2)push:将上述差值 x-min 入栈,如果压入的数大于等于0,则min保持不变,否则令 min=x为新的最小值。

3)pop :首先会把栈顶元素删除。然后考虑是否要改变min:

    1._如果栈顶元素是非负的,说明这个元素入栈时不小于当时的min,因此这个元素入栈时没有改变(更新)min,因此删除它的时候也就无需改变(恢复)min,即执行min-=0;

    2._如果栈顶元素是负数,说明这个元素入栈时小于当时的min,因此这个元素入栈时更新了min,因此删除它的时候要恢复min,即执行min-=diff;

4)top: 1._如果栈顶元素是非负的,说明这个元素入栈时不小于当时的min,因此它的入栈没有改变min,因此返回min+diffs[-1]

    2._如果栈顶元素是负的,则这个元素入栈时更新了min,而min存储的正是这个元素入栈时的值,因此返回min。

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: