实现带有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() -- 获取栈顶元素. ... 
随机推荐
- django如何检查创建的模型(model)是否有语法错误或者逻辑错误
			首先,用下面的命令验证模型的有效性: python manage.py validate validate 命令检查你的模型的语法和逻辑是否正确. 如果一切正常,你会看到 0 errors found ... 
- Vim 新用法
			daw , delete a word cw , delete from cursor to the end then insert mode a word 移动: f ; Aa Oo Cc Ii S ... 
- 7.cadence原理图后续[原创]
			一.网表输出 1.自动编号 输出网表前,不能有问号 -- 效果: ---- -- 效果: 2.DRC检查 输出网表前需要DRC检查 3.网表输出 二.生成BOM表 法1: 法2: --- 点击OK: ... 
- Python学习之类
			class Person: def __init__(self, name): self.name = name def sayHi(self): print('Hello, my name is'+ ... 
- css div居中显示的4种写法
			Demo:http://www.feman.cn/h5/center.html .absolute 绝对定位 这是我们最常用的一种居中定位写法 要求必须确定div的宽高度 目前市面上的浏览器基本上都支 ... 
- HeadFirst jsp 02 (体系结构)
			当请求到来时, 必须有人实例化 servlet, 或者至少建立一个新的线程来处理这个请求. 必须有人调用 servlet 的 doPost()或 doGet()方法. 另外还的有人管理 servlet ... 
- String.indexOf()
			int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引. int indexOf(int ch, int fromIndex) 从指定的索引开始搜索,返回在此字符串中第一次 ... 
- Qt Creator介绍
			简介 Qt Creator是使用Qt开发的IDE.Qt支持Windows.Linux/Unix.Mac OS X.Android.BlackBerry.QNX等多种平台,Qt Creator为不同平台 ... 
- blocked because of many connection errors; unblock with 'mysqladmin flush-hosts;MySQL在远程访问时非常慢的解决方法;MySql链接慢的解决方法
			一:服务器异常:Host 'xx.xxx.xx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin ... 
- java之IO
			IO流主要用于硬板.内存.键盘等处理设备上得数据操作 一.IO流分类 java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能,可以从不同角度对其分类: 1.按数据流的方向不同分为:输入流 ... 
