原文:
How would you design a stack which, in addition to push and pop, also has a function min which returns the minimum element? Push, pop and min should all operate in O(1) time.
译文:
实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值。 push,pop和min函数的时间复杂度都为O(1)。
可以通过改造栈中元素的方式,让栈中的每一个元素自身保存着从他到栈底的最小值,需要对push函数进行改写。
栈中元素 NodeMin
public class NodeMin {
int value;
int min;
public NodeMin(int value, int min) {
this.value = value;
this.min = min;
}
}
改写push(),增加min()
public class StackMin extends Stack<NodeMin> {
public StackMin() {
}
public void push(int value) {
int min = Math.min(value, min());
super.push(new NodeMin(value, min));
}
public int min() {
if (this.isEmpty()) {
return Integer.MAX_VALUE;
} else {
return super.peek().min;
}
}
}
testcase
public static void main(String args[]) {
StackMin stackm = new StackMin();
System.out.println(stackm.isEmpty());
System.out.println(stackm.min());
stackm.push(2);
System.out.println(stackm.min());
stackm.push(1);
System.out.println(stackm.min());
stackm.pop();
System.out.println(stackm.min());
}
如果栈内元素较多,每一个元素还需要保存最小值,会浪费很多存储空间,可以在栈中在添加一个栈用来保存最小值。
public class StackMin2 extends Stack<Integer> {
Stack<Integer> mins;
public StackMin2() {
mins = new Stack<>();
}
public void push(int value) {
if (value <= min()) {
mins.push(value);
}
super.push(value);
}
public Integer pop() {
int value = super.pop();
if (value == min()) {
mins.pop();
}
return value;
}
public int min() {
if (this.isEmpty()) {
return Integer.MAX_VALUE;
} else {
return this.mins.peek();
}
}
}