题目

实现一个特殊的栈,在实现栈的基础上,再实现返回栈中最小的元素的操作。

要求

  1. pop、push、getMin的时间复杂度是O(1)
  2. 可以使用现成的栈类型

思路

如下图所示,在栈结构中,每次pop的过程中,产生的最小值,分别为:1、2、6,在pop过程会出现两个规律:

  1. 每次pop的元素不是最小值时,整个栈的最小值保持不变,
  2. 越上的最小值越小

那么只需要引入多一个栈(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();
}
}

Github地址

实现带有getMin的栈的更多相关文章

  1. 设计一个带有getmin功能的栈,保证时间复杂度在O(1)

    2017-06-22  20:56:10 需要得到最小值,最简单的思路就是遍历一遍求出最小值.但是这样的时间复杂度会是O(n),不满足O(1)的要求.于是想到在建立一个栈来保存最小值. 具体操作是建立 ...

  2. OptimalSolution(6)--栈和队列

    一.设计一个有getMin功能的栈 题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作.pop.push.getMin操作的时间复杂度都是O(1). 思路:设计两个栈,一 ...

  3. LeetCode之Min Stack 实现最小栈

    LeetCode相关的网上资源比较多,看到题目一定要自己做一遍,然后去学习参考其他的解法. 链接: https://oj.leetcode.com/problems/min-stack/ 题目描述: ...

  4. 【老鸟学算法】包含 min函数的栈设计——java实现

    要求: 1. 定义栈的数据结构,要求添加一个 min函数,能够得到栈的最小元素. 2. 要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 这是考验“栈”数据结构设计.众所周知,栈 ...

  5. [Swift]LeetCode155. 最小栈 | Min Stack

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

  6. LeetCode 155 - 最小栈 - [数组模拟栈]

    题目链接:https://leetcode-cn.com/problems/min-stack/description/ 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的 ...

  7. LeetCode155.最小栈

    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...

  8. 41. 包含min函数的栈

    包含min函数的栈 描述 设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈. push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 ...

  9. LeetCode--155--最小栈(java版)

    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...

随机推荐

  1. 《c程序设计语言》读书笔记--统计换行数,空格数,tab数

    #include <stdio.h> int main() { int spa = 0,lin = 0,tab = 0; int c; /* spa代表空格个数,tab代表制表符个数,li ...

  2. PHP 时间函数 date 参数详解

    time();表示的是从1970-01-01到现在共走了多少秒,不便于看,但便于计算 要找出前一天的时间就是 time()-60*60*24; 要找出前一年的时间就是 time()*60*60*24* ...

  3. 2-Medium下的MultipleCommandAssembly

    1.首先创建一个控制台项目 2.添加引用[红色的都是将项目添加为引用,其中蓝色的log4net是直接从源代码下的Reference文件夹下引用的dll] 3.写代码 1)首先将config配置好[ht ...

  4. JQuery操作Ajax

    一.jQuery - AJAX 简介 AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). AJAX 是与服务器交换数据的艺术,它在 ...

  5. 【笨嘴拙舌WINDOWS】实践检验之GDI缩放

    SetMapmode(dc,MM_Text); //先继承MM_TEXT的属性 SetMapMode(dc,MM_ANISOTROPIC); SetWindowExtEx(dc,rect.Right, ...

  6. IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)(转载)

    继续说说ios不同版本之间的适配 先说一个东西:在xcode当中有一个东西叫targets,苹果的官方文档是这样说的: A target specifies a product to build an ...

  7. mysql 存储过程 事务; mysql的事务中包含一个存储过程

    在asp.net结合mysql的开发中,我平时用到的事务处理是 使用 TransactionOptions  来进行处理 TransactionOptions transactionOption = ...

  8. Phpstorm Xdebug Web程序调试

    平时调试php程序的时候,可以通过在代码中添加var_dump等函数来实现简单的断点调试. 下面介绍另一种方法,通过Phpstorm和Xdebug来进行调试. 1.下载Xdebug 这个是官网下载地址 ...

  9. Http进行网络通信

    http使用get的方式进行网络通信: package com.testGet; import java.io.BufferedReader; import java.io.IOException; ...

  10. HDU 1015 Safecracker

    解题思路:这题相当诡异,样例没过,交了,A了,呵呵,因为理论上是可以通过的,所以 我交了一发,然后就神奇的过了.首先要看懂题目. #include<cstdio> #include< ...