用stack实现min stack
遇到个好玩的问题,就是用一个stack实现min stack,什么意思呢,就是我实现stack,但是能以O(1)的时间复杂度和空间复杂度去找到我stack里面的最小值。
常规的方法是:用一个变量存放当前最小值,但是会出现这种情况,就是当我的stack pop掉的值刚好是最小值时候,后面就没法知道当前的最小值了。
怎么办呢?可以考虑在push阶段做个改变,就是在我每次往stack里面push数据的时候,跟当前的最小值比较,如果比当前最小值还小的话,那么将当前最小值入栈,再把最小值修改为这个值。在pop阶段,如果遇到pop出来的值刚好等于当前的最小值,那么将下一个值pop出来,并将pop出来的值设置为当前栈中最小值,这个值就是在push阶段时放进去的,表明这个位置的下面位置都比这个值小。
附录python源码:
class MinStack(object):
def __init__(self):
self.stack = []
self.min = 0
def push(self, m):
if(len(self.stack) == 0):
self.min_ = m
self.stack.append(m)
else:
if m <= self.min_:
self.stack.append(self.min_)
self.min_ = m
self.stack.append(m)
else:
self.stack.append(m)
def pop(self):
if self.stack[len(self.stack) - 1] == self.min_:
self.stack.pop()
self.min_ = self.stack.pop()
else:
self.stack.pop()
def get_min(self):
return self.min_
if __name__ == '__main__':
min_stack = MinStack()
min_stack.push(4)
min_stack.push(5)
min_stack.push(7)
min_stack.push(6)
min_stack.push(-3)
min_stack.push(-6)
min_stack.push(18)
min_stack.pop()
min_stack.pop()
print min_stack.get_min()
用stack实现min stack的更多相关文章
- 带最小值操作的栈 · Min Stack
[抄题]: 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. [思维问题]: [一句话思 ...
- [LintCode] Min Stack 最小栈
Implement a stack with min() function, which will return the smallest number in the stack. It should ...
- [CareerCup] 3.2 Min Stack 最小栈
3.2 How would you design a stack which, in addition to push and pop, also has a function min which r ...
- leetcode 155. Min Stack --------- java
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...
- Min Stack [LeetCode 155]
1- 问题描述 Design a stack that supports push, pop, top, and retrieving the minimum element in constant ...
- Min Stack
Min Stack Design a stack that supports push, pop, top, and retrieving the minimum element in constan ...
- 【leetcode】155 - Min Stack
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...
- lintcode 中等题:Min stack 最小栈
题目 带最小值操作的栈 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 解题 可以定义 ...
- Java [Leetcode 155]Min Stack
题目描述: Design a stack that supports push, pop, top, and retrieving the minimum element in constant ti ...
随机推荐
- vs asp.net 给所有邮箱发邮件,案例,源代码,c#
//发送邮箱 MailMessage mailObj = new MailMessage(); mailObj.From = new MailAd ...
- java.lang.IllegalArgumentException的解决方法
java.lang.IllegalArgumentException这个错误基本上就是jdk版本的问题 把jdk1.8换成jdk1.7就可以了 这里可以设置jdk最低版本 这里默认要选择jdk1.7 ...
- (转)一个大牛的acm历程(看着就要颤抖)
从我接触程序竞赛到现在应该有十多年了,单说ACM竞赛,从第一次非正式参赛到现在也差不多有7年多的样子.有太多的故事,想说的话,却一直没能有机会写下来.一方面是自己忙,一方面也是自己懒.所以很感谢能有人 ...
- eclipse 打开 maven项目,出现红色的感叹号
解决: 选中有感叹号的项目右键,用maven>>update project解决.[然后我再添加java system 类库就可以了]
- RabbitMQ入门(3)——发布/订阅(Publish/Subscribe)
在上一篇RabbitMQ入门(2)--工作队列中,有一个默认的前提:每个任务都只发送到一个工作人员.这一篇将介绍发送一个消息到多个消费者.这种模式称为发布/订阅(Publish/Subscribe). ...
- Centos7.2 FastDFS_V5.05 集群的安装与配置1
环境: Centos 7.2/64位 两台服务器 都为tracker 和 storage 10.100.0.1 storage tracker10.100.0.2 storage tracker ...
- js 弹出层,以及在javascript里定义层样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ADC第一次读取
在ADCCON中,最后0位和1位互斥.如果1位选1的话,0位的值无效.如果1位选0的话,0位的值才有效.当1位选1的话:这是应用层的程序 #if ADSTART==0void niuniu(void) ...
- hduacm集训单人排位赛1002
自适应simpson积分公式 通过二分区间递归求simpson积分 #include<map> #include<set> #include<cmath> #inc ...
- docker nginx 问题
'经常不启动docker会遇到如下问题 启动docker pull * 会报错 1. 安装步骤: 解决办法:命令输入:docker logout 再次执行:docker pull * 2. 执行ru ...