转载摘录自http://blog.jobbole.com/106940/
问题:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)。
解决方案:
1、设原有的栈为栈A,创建额外的栈B。用于辅助原栈A。
2、当第一个元素入A栈时,将新元素的下标进入栈B,此时栈B的栈顶元素是栈A当前最小值的下标。
3、每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素的下标进入栈B,此时栈B的栈顶元素就是栈A当前最小值的下标。
4、每当栈A有元素出栈时,如果出栈元素是栈A当前最小值,则让栈B的栈顶元素也出栈。此时栈B余下的栈顶元素所指向的,是栈A当中原本第二小的元素,代替刚才的出栈元素 成为了栈A的当前最小值。(备胎转正)
5、当调用getMin方法的时候,直接返回栈B的栈顶所指向的栈A对应元素即可。

另外在评论里面得到另外的一种解决方案:
对于节点额外的增加一个字段,记录当前为止栈的最小值
package cn.com.duanyi;
public class MinStack {
public Elem top;
/** initialize your data structure here. */
public MinStack() {
}
public void push(int x) {
if(top == null){
top = new Elem(x, x);
}else{
Elem e = new Elem(x, Math.min(x,top.min));
e.next = top;
top = e;
}
}
public void pop() {
if(top == null)
return;
Elem temp = top.next;
top.next = null;
top = temp;
}
public int top() {
if(top == null)
return -1;
return top.value;
}
public int getMin() {
if(top == null)
return -1;
return top.min;
}
public static void main(String[] args) {
MinStack minStack=new MinStack();
minStack.push(4);
minStack.push(8);
minStack.push(3);
minStack.push(5);
minStack.push(2);
minStack.pop();
System.out.println(minStack.getMin());
}
}
class Elem{
public int value;
public int min;
public Elem next;
public Elem(int value, int min){
this.value = value;
this.min = min;
}
}
浙公网安备 33010602011771号