设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
实现入栈出栈操作,以及获取最小数的操作利用list都能很方便的实现,最新元素加入在list末尾,每次pop时就remove l ist末尾的那个元素,获取最小数则让list第一个元素始终存储list中最小值,那就需要在每次push和pop操作时判断这个min是否需要更新。
题解中很棒的思路:
利用一个栈,同时维持最小值,最小值的更新要么是push进了一个新的min,要么是pop掉了最小值。如果最小值被pop,我们需要让原来的次小值成为新的最小值,那就可以每次如果要push进新的min,我们就push原来的min(次小值),与新的min,在pop操作时,如果我们pop的元素等于min,那就pop出两个值,这个pop出来的的第二个数就等于次小值,然后我们更新min为这个此小值。
class MinStack {
List<Integer> list ;
public MinStack() {
list = new ArrayList<>();
list.add(0);
}
public void push(int val) {
list.add(val);
if(val< list.get(0)){
list.set(0 ,val);
}
}
public void pop() {
list.remove(list.size()-1);
for (int i = 0; i < list.size(); i++) {
if (list.get(0)>list.get(i)) {
list.set(0,list.get(i));
}
}
}
public int top() {
return list.get(list.size()-1);
}
public int getMin() {
return list.get(0);
}
}
题解中思路的代码:
class MinStack {
private int min = Integer.MAX_VALUE;
private Stack<Integer> stack;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
}
public void push(int x) {
if(min >= x){
stack.push(min);
min = x;
}
stack.push(x);
}
public void pop() {
if(stack.pop() == min){
min = stack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return min;
}}
/**