Hay una solución más creativa sin utilizar una pila auxiliar.
Suponiendo que vamos a empujar un valor numérico en una pila con el número mínimo min. Si valor es mayor o igual que min, se envía directamente a la pila de datos. Si es menos de min, empujamos 2 * valor - min, y actualizamos min como valor ya se empuja un nuevo número mínimo.
¿Qué tal pop?Lo mostramos directamente si la parte superior de la pila de datos (se denota como arriba) es mayor o igual que min. De lo contrario, el número arriba no es el número real empujado. El número real empujado se almacena como min. Después de que aparezca el número mínimo actual, debemos restablecer el número mínimo anterior, que es 2 * mínimo - * arriba *.
Ahora demos la corrección de esta solución. Cuando valor es igual o mayor que min, se empuja directamente a la pila de datos sin actualizar min. Por lo tanto, cuando encontramos que la parte superior de la pila de datos es mayor o igual que min, podemos abrir directamente sin actualizar min. Sin embargo, si encontramos valor es menor que min, pulsamos 2 * valor - * min *. Deberíamos notar que 2 * valor - * min * es menor que valor. Luego actualizamos el mínimo como valor. Por lo tanto, la nueva parte superior de la pila de datos (arriba) es menor que la actual min. Por lo tanto, cuando descubrimos que la parte superior de la pila de datos es menor que min, la parte superior real (número real empujado valor) se almacena en min. Después de abrir la parte superior de la pila de datos, debemos restaurar el número mínimo anterior. Desde superior = 2 * valor -Anterior min y valor es actual min, permeable min es 2 * actual min-superior.
El C++ código de ejemplo se muestra a continuación:
template <typename T> class StackWithMin {
public:
StackWithMin(void) {}
virtual ~StackWithMin(void) {}
T& top(void);
void push(const T& value);
void pop(void);
const T& min(void) const;
private:
std::stack<T> m_data; // data stack, to store numbers
T m_min; // minimum number
};
template <typename T> void StackWithMin<T>::push(const T& value) {
if(m_data.size() == 0) {
m_data.push(value);
m_min = value;
}
else if(value >= m_min) {
m_data.push(value);
}
else {
m_data.push(2 * value - m_min);
m_min = value;
}
}
template <typename T> void StackWithMin<T>::pop() {
assert(m_data.size() > 0);
if(m_data.top() < m_min)
m_min = 2 * m_min - m_data.top();
m_data.pop();
}
template <typename T> const T& StackWithMin<T>::min() const {
assert(m_data.size() > 0);
return m_min;
}
template <typename T> T& StackWithMin<T>::top() {
T top = m_data.top();
if(top < m_min)
top = m_min;
return top;
}
Esta solución ha sido tomada de my blog, y mi libro "Coding Interviews: Questions, Analysis & Solutions".
posible duplicado de [Pila con find-min/find-max más eficiente que O (n)?] (Http://stackoverflow.com/questions/7134129/stack-with-find-min-find-max- more-efficient-than-on) – templatetypedef