前言
新的一年,好好学习。尝试用python写写代码。
正文
问题来源
本问题来自leetcode上的155题。
问题描述
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) – 将元素 x 推入栈中。
pop() – 删除栈顶的元素。
top() – 获取栈顶元素。
getMin() – 检索栈中的最小元素。
示例 1:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
分析:
用两个栈分别记录所有元素和当前最小元素。对所有元素的栈push,pop与普通栈操作相同;而对最小栈的push操作需要判断push进来的元素小于最小栈的栈顶则加入,pop操作要所有元素的栈顶元素与最小栈的元素相同才进行弹出操作。
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.min_stack = []
self.total_stack = []
def push(self, x):
"""
:type x: int
:rtype: None
"""
self.total_stack.append(x)
if not self.min_stack or (self.min_stack and self.min_stack[-1] >= x):
self.min_stack.append(x)
def pop(self):
"""
:rtype: None
"""
x = self.total_stack.pop()
if self.min_stack[-1] == x:
self.min_stack.pop()
return x
def top(self):
"""
:rtype: int
"""
return self.total_stack[-1]
def getMin(self):
"""
:rtype: int
"""
return self.min_stack[-1]
要注意的是push操作的时候需要最小栈非空,且栈顶元素要大于等于插入元素(不能仅大于)。假设先push 0 1 0,随后pop,然后getMin会导致出现问题。
总结:
勤思考。
结语
不管怎么样好好加油。