设计一个支持 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.
分析:
桟可以用数组实现,由于不知道长度 ,用 ArrayList 实现
要求 getMin() 在常数时间内检索到最小元素,每次在 ArrayList 里查找最小元素的话,一定不满足要求;
采用 空间换时间 的方法,另设一个桟 minNums(同样用ArrayList 和一个int 型栈顶指针 实现),记录每次插入后当前最小的元素,这样
- getMin() 只需返回栈顶元素即可
- push(int x) 的时候,判断是否小于等于栈顶元素,是的话,放入minNums中;
- pop() 的时候,判断栈顶元素是否是当前最小元素,即是否等于minNums 栈顶元素,如果是,就也弹出 minNums 栈顶元素,这时 minNums 栈顶元素 就是上一个元素添加前的最小元素。
class MinStack {
List<Integer> stacklist;
List<Integer> minNums;
int a;//栈顶指针
int b;//最小元素桟顶指针
/** initialize your data structure here. */
public MinStack() {
stacklist=new ArrayList<Integer>();
minNums=new ArrayList<Integer>();
a=-1;
b=-1;
}
public void push(int x) {
a++;
stacklist.add(x);
if(b==-1||minNums.get(b)>=x){
b++;
minNums.add(x);
}
}
public void pop() {
int thisremove=(int) stacklist.remove(a);
a--;
if(minNums.get(b)==thisremove){
minNums.remove(b);
b--;
}
}
public int top() {
return stacklist.get(a);
}
public int getMin() {
return minNums.get(b);
}
}