实现带有getMin的栈
题目
实现一个特殊的栈,在实现栈的基础上,再实现返回栈中最小的元素的操作。
要求
- pop、push、getMin的时间复杂度是O(1)
- 可以使用现成的栈类型
思路
如下图所示,在栈结构中,每次pop的过程中,产生的最小值,分别为:1、2、6,在pop过程会出现两个规律:
- 每次pop的元素不是最小值时,整个栈的最小值保持不变,
- 越上的最小值越小
那么只需要引入多一个栈(minElementStack),在push时,在minElementStack的栈顶里面保存比当前最小值还小的元素就可以了,而minElementStack的栈顶始终保持当前栈中最小的元素。在pop时,当pop掉栈的最小值元素,只需同时pop掉minElementStack中的元素就好了。

代码
package com.github.zhanyongzhi.interview.algorithm.stacklist;
import java.util.Stack;
/**
* 带有getMin的栈
* @author zhanyongzhi
*/
public class GetMinStack<T extends Comparable<T>> {
Stack<T> stack;
Stack<T> minElementStack;
public GetMinStack(){
stack = new Stack<T>();
minElementStack = new Stack<T>();
}
public void push(T item) {
stack.push(item);
if(minElementStack.empty()) {
minElementStack.push(item);
return;
}
T topItem = getMin();
if(0 <= item.compareTo(topItem))
return;
//当前加入的元素是最小的则加入到minElementStack中
minElementStack.push(item);
}
public T pop(){
T item = stack.pop();
T topItem = getMin();
//如果当前弹出的是最小的元素
if(topItem.equals(item))
minElementStack.pop();
return item;
}
public T getMin(){
return minElementStack.peek();
}
}
实现带有getMin的栈的更多相关文章
- 设计一个带有getmin功能的栈,保证时间复杂度在O(1)
2017-06-22 20:56:10 需要得到最小值,最简单的思路就是遍历一遍求出最小值.但是这样的时间复杂度会是O(n),不满足O(1)的要求.于是想到在建立一个栈来保存最小值. 具体操作是建立 ...
- OptimalSolution(6)--栈和队列
一.设计一个有getMin功能的栈 题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作.pop.push.getMin操作的时间复杂度都是O(1). 思路:设计两个栈,一 ...
- LeetCode之Min Stack 实现最小栈
LeetCode相关的网上资源比较多,看到题目一定要自己做一遍,然后去学习参考其他的解法. 链接: https://oj.leetcode.com/problems/min-stack/ 题目描述: ...
- 【老鸟学算法】包含 min函数的栈设计——java实现
要求: 1. 定义栈的数据结构,要求添加一个 min函数,能够得到栈的最小元素. 2. 要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 这是考验“栈”数据结构设计.众所周知,栈 ...
- [Swift]LeetCode155. 最小栈 | Min Stack
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...
- LeetCode 155 - 最小栈 - [数组模拟栈]
题目链接:https://leetcode-cn.com/problems/min-stack/description/ 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的 ...
- LeetCode155.最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...
- 41. 包含min函数的栈
包含min函数的栈 描述 设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈. push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 ...
- LeetCode--155--最小栈(java版)
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...
随机推荐
- 详细记录python的range()函数用法
使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的slide,最后分析一个好玩儿的冒泡程序. 这里记 ...
- hadoop多次格式化后,导致datanode启动不了
hadoop namenode -format多次格式化后,datanode启动不了 org.apache.hadoop.ipc.RemoteException(java.io.IOException ...
- Qt之QHeaderView自定义排序(获取正确的QModelIndex)
简述 前几节中分享过关于自定义排序的功能,貌似我们之前的内容已经可以很好地解决排序问题了,但是,会由此引发一些很难发现的问题...比如:获取QModelIndex索引错误. 下面,我们先来实现一个整行 ...
- 51nod1201 整数划分
01背包显然超时.然后就是一道神dp了.dp[i][j]表示j个数组成i的方案数.O(nsqrt(n)) #include<cstdio> #include<cstring> ...
- mysql script for dynamic running sql script
),startTime datetime,endTime datetime) BEGIN set @s1 = concat('SELECT * FROM ', deviceName , ' where ...
- 使用 github.io 免费建站
/*************************************************************************** * 使用 github.io 免费建站 * 说 ...
- 选择符优先级-----:link伪类
问题:请指出以下结构中,A标签内的字体颜色. <style> a{ color:#ccc}/* 灰色 */ .alink a{color:#F60}/* 橙色 */ h1 a{color: ...
- Java反射基本玩法
三个主要的反射类 Class反射对象描述类语义结构,可以从Class对象中获取构造函数.成员变量.方法类等元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作.这些反射对象类在java. ...
- 【转】Linux设备驱动之mmap设备操作
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/08/2281222.html 1.mmap系统调用 void *mmap(void *addr, ...
- Windows下配置cygwin和ndk编译环境
cygwin安装 正确的安装步骤其实很简单:1. 下载setup-86_64.exe 2. 直接从网上下载安装,选择包时,顶部选择“default”不变 3. 搜索make,勾选make,cmake, ...