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

本文探讨如何使用Java实现一个栈,其min、push和pop操作的时间复杂度均为O(1)。常见解决方案通常采用链式存储或复杂的数据结构体。这里分享一种基于数组的Java实现方法,欢迎讨论和指正。
摘要由CSDN通过智能技术生成

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值