Pila mínima
Descripción del problema
Diseñe una pila que admita operaciones push, pop, top y pueda recuperar el elemento más pequeño en un tiempo constante.
push (x) -Presione el elemento x en la pila.
pop () —— Elimina el elemento en la parte superior de la pila.
top (): obtiene el elemento superior de la pila.
getMin (): recupera el elemento más pequeño de la pila.
respuesta
Pensé que el tema era implementar una pila con una estructura de datos básica, así que usé una matriz para lograr:
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;
}
}
Después de leer la solución oficial, descubrí que se usó la pila auxiliar:
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();
}
}