设计桟的 min、push以及pop的时间复杂度都是O(1) Java 实现

设计桟的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());
	}
}

点赞