1. 题目分析
- 乍一看好像很简单,不就是定义一个栈嘛,但是注意题目的第一句话,在常数时间内检索道最小元素,也就是说,我们不能等道执行getMin()的时候再来遍历栈中的元素得到最小值,那样就太浪费时间了。
- 那么我们应该怎么办呢?下面给出解决方案
条件:
- 不能在getMin()中求最小值
- 栈随时都能得到最小值,而且是在时间很短的情况下。
思考:
- 在最短的时间得到最小值,那么最短的时间花费是什么呢?仔细一想,我们就明白了,我们需要在每个操作中时时刻刻记录最小值,道需要的时候拿出来用就行了
解决:
- 题目只给出了执行时间限制,所以我们可以牺牲空间来减少执行的时间,我们这里处理原有的栈之外再定义一个辅助栈proxy_stack
- 入栈的时候,将stack中的最小值也加入道proxy_stack中,出栈的时候,proxy_stack也出栈,这样就很容易理解了,proxy_stack记录了stack时时刻刻的最小值。
2. 代码实现
2.1. Python代码
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.main_stack = []
self.proxy_stack = []
def push(self, x):
"""
:type x: int
:rtype: None
"""
self.main_stack.append(x)
self.proxy_stack.append(min(self.main_stack))
def pop(self):
"""
:rtype: None
"""
x = self.main_stack.pop()
self.proxy_stack.pop()
return x
def top(self):
"""
:rtype: int
"""
return self.main_stack[-1]
def getMin(self):
"""
:rtype: int
"""
return self.proxy_stack[-1]
2.2. Java代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MinStack {
List<Integer> stack = new ArrayList();
List<Integer> proxy_stack = new ArrayList();
/** initialize your data structure here. */
public MinStack() {
}
public void push(int x) {
stack.add(0,x);
proxy_stack.add(0,Collections.min(stack));
}
public void pop() {
stack.remove(0);
proxy_stack.remove(0);
}
public int top() {
return (int) stack.get(0);
}
public int getMin() {
return proxy_stack.get(0);
}
}