2021-10-22 漫画算法 小灰的算法之旅--第五章 面试中的算法(二)

本文介绍了一种实现带有获取最小元素功能的栈的方法,通过维护两个栈来保证O(1)的时间复杂度。主要操作包括入栈、出栈和获取最小值,其中最小值栈用于记录当前栈的最小元素,确保在入栈和出栈时更新最小值信息。这种方法对于解决需要快速访问最小元素的问题非常有效。
摘要由CSDN通过智能技术生成

面试中的算法

题目

实现一个栈,该栈带有出栈,入栈,取得最小元素3个方法,保证3个方法的时间复杂度最小为O(1)

方法:
1.设原有栈为栈A,再创建一个额外的栈B,当第一个元素入栈A时,也入栈B,作为栈A当前的最小值
在这里插入图片描述
2.每次入栈A时,比较新元素和栈A当前的最小值,如果小则让新元素入栈B,作为新的最小值
在这里插入图片描述

3.每次出栈时,如果出栈元素时栈A当前最小值,则让栈B的栈顶元素也出栈,此时栈A当中原本第二小的元素代替出栈元素成为了当前最小值
在这里插入图片描述
4.当调用getMin方法时,返回栈B的栈顶值,这也就是栈A的当前最小值

代码

private Stack<Integer> mainStack = new Stack<Integer>();
private Stack<Integer> minStack = new Stack<Integer>();

public void push(int element)
{
	mainStack.push(element);
	if(minStack.empty() || element <= minStack.peek())
	{
		minStack.push(element);
	}
}
public Integer pop()
{
	if(mainStack.peek().equals(minStack.peek()))
	{
		minStack.pop();
	}
	return mainStack.pop();
}
public int getMain() throws Exception
{
	if(mainStack.empty())
	{
		throw new Exception("stack is empty");
	}
	return minStack.peek();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值