最小栈
问题描述
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
题解
我以为题目是让用基础的数据结构实现一个栈,所以我用了数组来实现:
class MinStack {
int cur = -1 ;
int minnum = Integer.MAX_VALUE ;
int a[] = new int[100000];
/** initialize your data structure here. */
public MinStack() {
}
public void push(int x) {
cur++;
a[cur]=x;
if(x<minnum)
minnum = x;
}
public void pop() {//时间复杂度:O(n)
cur--;
if(a[cur+1] == minnum){//如果出栈的数是最小值,则重新找最小值
minnum = Integer.MAX_VALUE;
for(int i=0;i<=cur;i++){
if(a[i]<minnum)
minnum = a[i];
}
}
}
public int top() {
return a[cur];
}
public int getMin() {
return minnum;
}
}
看了官解之后发现用的是辅助栈:
class MinStack {
Deque<Integer> xStack;
Deque<Integer> minStack;
public MinStack() {
xStack = new LinkedList<Integer>();
minStack = new LinkedList<Integer>();
minStack.push(Integer.MAX_VALUE);
}
public void push(int x) {
xStack.push(x);
minStack.push(Math.min(minStack.peek(), x));
}
public void pop() {
xStack.pop();
minStack.pop();
}
public int top() {
return xStack.peek();
}
public int getMin() {
return minStack.peek();
}
}