问题描述:
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
思考:
常数级时间,也就是每次使用一个方法时不要遍历栈,否则就是o(N)级时间了(线性,倾斜直线),top(),pop(),push()操作本身就是常数级操作,所以这里只考虑找出最小值,具体方法为,使用一个栈(最小栈)(数组实现,访问栈顶常数级时间o(N))来累加最小值,这样最小栈的栈顶到栈首是最小值累加的集合。
代码(java):
class MinStack {
ArrayList<Integer> stack = new ArrayList<Integer>();
ArrayList<Integer> minstack = new ArrayList<Integer>();
//入栈
public void push(int x) {
stack.add(x);
if(minstack.size()==0){
minstack.add(x);
}
else{
if(minstack.get(minstack.size()-1) >= x){
//维持最小栈的最小值,也是栈的最小值
minstack.add(x);
}
}
}
//出栈
public void pop() {
if(!stack.isEmpty()){
int element = stack.remove(stack.size()-1);
if(element == minstack.get(minstack.size()-1)){
minstack.remove(minstack.size()-1);
}
}
}
//返回栈顶元素
public int top() {
if(stack.size() ==0){
return -1;
}
else{
return stack.get(stack.size()-1);
}
}
//返回栈最小元素
public int getMin() {
return minstack.get(minstack.size()-1);
}
}