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。
这种以空间-时间tradeoff的方法很普通,下面来看一种酷炫的实现,常数空间复杂度:
Solution 2:
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。
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。
相关文章推荐
- Vertica变化Local时间到GMT时间
- Redhat 账号的设置
- [LeetCode]Reverse Integer
- 百度地图自定义大头针
- 关于指令forward和form的使用
- 算法学习(开篇)
- hdu1280 前m大的数(数组下标排序)
- 摒弃一切杂念,奋发图强
- CoreData知识总结
- Android开发框架--AndroidAnnotations(一)
- 任笑萱 2015/7/6 个人文档
- Java语言基础
- ajax请求不等服务器返回直接进入error
- SDNU 1136.Balloons【山东省第一届ACM】【7月20】
- 让map不能进行操作
- 静态区,栈区,堆区的区别
- 使用SQL语句创建SQL数据脚本(应对万网主机部分不支持导出备份数据)
- linux任务管理
- 【nginx】nginx介绍-集成lua
- Android首次启动时间长优化之预编译提取Odex