1. 题目描述
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) -- 将元素 x 推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
2.思路
- 首先想到是利用python中的列表来做,进栈用append,出站用pop,但是这里还有一个小要求是要能检索到栈中的最小元素并且是在常数时间内。
- 算法一般都是空间换时间或者时间换空间,要想得到最小元素并且是在常数时间内,在建栈的时候就保存这个索引就行了,详情见代码。
3.解决
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.my_stack = []
def push(self, x):
"""
:type x: int
:rtype: void
"""
current_min = self.getMin()
if not current_min or x < current_min:
current_min = x
self.my_stack.append((x, current_min)) # 关键点在这,这里相当于保存每个元素所对应最小值
def pop(self):
"""
:rtype: void
"""
self.my_stack.pop()
def top(self):
"""
:rtype: int
"""
return self.my_stack[-1][0]
def getMin(self):
"""
:rtype: int
"""
if len(self.my_stack) == 0:
return None
else:
return self.my_stack[-1][1]
网友评论