设计桟的min、push以及pop的时间复杂度都是O(1) ,这道题目是软件开发笔试中的高频题。
我阅读了一些大牛写的这个题目的答案。很多都是用c完成的,而且用了链式存储,或者多种结构体。
今天我就上一个我写的java版本(使用数组实现)。如有问题,欢迎指正。
**
* 要求push、pop、min都是o(1)时间内完成。
*
* @author cui
*
*/
public class MinStack {
int initSize = 10;
int inc = 5;// 增长因子
int[] values = new int[initSize];// 存放堆栈中的数据
int[] min = new int[initSize];// 最小数的索引,也可以用一个堆栈存放。
int size;// 栈中的有效元素个数
/**
* 扩充数组
*/
public void expand() {
int[] newValues = new int[values.length + inc];
System.arraycopy(values, 0, newValues, 0, values.length);
values = newValues;
newValues = new int[min.length + inc];
System.arraycopy(min, 0, newValues, 0, min.length);
min = newValues;
}
/**
* 将 value 压入栈顶
*
* @param value
*/
public void push(int value) {
if (size > values.length - 1 ) {
expand();
}
values[size] = value;
if (size == 0) {
min[size] = size;
} else {
if (value < values[min[size - 1]]) {// 每次将最小值的index存到min数组中
min[size] = size;
} else {
min[size] = min[size - 1];
}
}
++size;
}
/**
* 弹出栈顶元素
*
* @return
*/
public Integer pop() {
if (size <= 0) {
return null;
}
return values[--size];
}
/**
* 返回当前栈中的最小值
*
* @return
*/
public Integer min() {
return size > 0 ? values[min[size - 1]] : null;
}
@Override
public String toString() {
return "MinStack [values=" + Arrays.toString(values) + ", min="
+ Arrays.toString(min) + "]";
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
MinStack min = new MinStack();
min.push(-1);
min.push(-2);
min.push(-3);
min.push(0);
min.push(-10);
min.push(-1);
min.push(-2);
min.push(-3);
min.push(0);
min.push(-10);
min.push(-20);
min.push(-20);
min.pop();
min.pop();
min.pop();
System.out.println(min.min());
}
}