设计一个支持 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.
这个题比较简单的想法就是利用两个栈,一个栈存所有的数据,另一个栈存到每个元素当前的最小值。然后还有一种思路就是一个栈存所有数据,而另一个栈只存不同的最小值,这样再pop的时候如果当前最小值等于栈顶元素,那么不仅存所有元素的栈要pop,最小值栈也要pop。还有一种思路就是只用一个栈,原理是一样的,如果最小元素更新,那么就存储之前的最小元素和当前值,然后更新最小元素,在pop时,如果当前元素等于最小元素,那么就要pop两次并更新最小元素。
C++源代码:
class MinStack {
private:
stack<int> all;
stack<int> min;
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
all.push(x);
if (min.size()==0 || min.top()>x)
min.push(x);
else
min.push(min.top());
}
void pop() {
all.pop();
min.pop();
}
int top() {
return all.top();
}
int getMin() {
return min.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
python3源代码:
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.l = []
self.minNum = sys.maxsize
def push(self, x):
"""
:type x: int
:rtype: void
"""
if x <= self.minNum:
self.l.append(self.minNum)
self.minNum = x
self.l.append(x)
def pop(self):
"""
:rtype: void
"""
if self.l[-1] == self.minNum:
self.l.pop()
self.minNum=self.l[-1]
self.l.pop()
else:
self.l.pop()
def top(self):
"""
:rtype: int
"""
return self.l[-1]
def getMin(self):
"""
:rtype: int
"""
return self.minNum
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()