一、题目描述

  定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

二、思路解析

  首先定义一个Integer类型的栈,记为stack,此栈用来完成数据正常的push()、pop()、top()和peek()等操作。
  然后定义一个Integer类型的栈,记为minStack(一定要理解清楚此栈的作用),此栈主要用来记录每一次stack进行push、pop、top和peek等操作后stack栈中的最小元素,所以stack的每一次push或者pop操作后,都需要对minStack进行更新处理,以保证minStack能够及时记录stack当前元素中的最小值(stack和minStack需要进行同步操作,也即stack有元素入栈时候,minStack也要入栈一个特殊的元素(以更新stack中新的最小值);stack出栈时候,minStack也要出栈(以更新记录stack中新的最小值))。简单说,minStack就是实时记录stack中最小元素值,为了保证实时记录的任务,minStack对于stack的push和pop操作需要作出相应的操作。

  1、stack入栈时候,minStack需要进行的操作

    (1)如果入栈元素node比minStack栈顶元素小(此处没有讨论stack为空的情况,如果stack为空,则stack和minStack都入栈node元素)
      则在stack入栈后,把入栈元素node也加入到minStack栈顶(保证minStack记录stack当前所有元素中的最小值)
    (2)如果入栈元素node比minStack栈顶元大
      此情况说明入栈node后stack中最小值没有变,最小值还是入栈前的最小值,所以node不应该加入到minStack的栈顶,但是minStack仍然需要入栈一个元素,这个元素的大小等于minStack的栈顶元素,如下代码中所示:“minStack.push(minStack.peek());”。这个比较容易忽略,其实只要想一想minStack的作用就很容易理解。

  2、stack出栈时候,minStack需要进行的操作

    stack出栈时,minStack也要出栈,以更新对stack最小值的记录。

  3、过程模拟

    (1)假设stack连续入栈元素为5,3,6,4,2,3,1,则minStack中先后入栈元素为5,3,3,3,2,2,1。
    (2)在(1)基础上,假设stack先后出栈1,3,2,则minStack先后出栈1,2,2。

三、java代码   

public class Solution {
Stack<Integer> stack = new Stack();
Stack<Integer> minStack = new Stack();

public void push(int node) {
if(stack.empty()){
stack.push(node);
minStack.push(node);
}else{
stack.push(node);
if(node < minStack.peek()){
minStack.push(node);
}else{
minStack.push(minStack.peek());
}
}
}

public void pop() {
stack.pop();
minStack.pop();
}

public int top() {
return stack.peek();
}

public int min() {
return minStack.peek();
}
}

以上均为个人理解,如果不正确、不合理或者可以优化的地方,欢迎下方留言。 

《剑指Offer》第20题(Java实现):定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。的更多相关文章

  1. 剑指offer 面试20题

    面试20题: 题目:表示数值的字符串 题:请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123 ...

  2. 面试 15:顺时针从外往里打印数字(剑指 Offer 第 20 题)

    面试 15:顺时针从外往里打印数字 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数字.例如输入: {{1,2,3}, {4,5,6}, {7,8,9}} 则依次打印数字为 1.2.3. ...

  3. 剑指Offer第36题—Java版

    本题使用归并排序的思想,结合归并排序,写出的算法解. //数组中的逆序对 public static int InversePairs(int[] array){ if(array==null||ar ...

  4. 剑指offer20:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

    1 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 2. 思路和方法 利用辅助栈来存储现有栈的最小值.在入栈和出栈的时候将现有栈和最小 ...

  5. 【剑指Offer】20、包含min函数的栈

      题目描述:   定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).   解题思路:   使用两个stack,一个为数据栈,另一个为辅助栈.数据栈 ...

  6. 《剑指offer》算法题第十二天

    今天是<剑指offer>算法题系列的最后一天了,但是这个系列并没有包括书上的所有题目,因为正如第一天所说,这些代码是在牛客网上写并且测试的,但是牛客网上并没有涵盖书上所有的题目. 今日题目 ...

  7. 《剑指offer》刷题目录

    <剑指offer>刷题目录 面试题03. 数组中重复的数字 面试题04. 二维数组中的查找 面试题05. 替换空格 面试题06. 从尾到头打印链表 面试题07. 重建二叉树 面试题09. ...

  8. 浅谈《剑指offer》原题:不使用条件、循环语句求1+2+……+n

    转载自:浅谈<剑指offer>原题:求1+2+--+n 如侵犯您的版权,请联系:windeal12@qq.com <剑指offer>上的一道原题,求1+2+--+n,要求不能使 ...

  9. 【剑指Offer面试编程题】题目1522:包含min函数的栈--九度OJ

    题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(1<=n&l ...

随机推荐

  1. 生产者消费者synchronized wait notify

    package ProduceQueueProduce; import java.util.Queue; public class ProducerThread extends Thread { pu ...

  2. WordPress版微信小程序3.1.5版的新功能

    产品的完善是无止境,每过段时间就会发现产品的新问题,使用的人越多,提的需求也会越多,我听得最多的一句话就是:如果加上某某功能就完美了.其实,完美是不存在的,每个人的视角不一样,完美的定义也是不一样的. ...

  3. shell中使用类似Python的参数处理

    params=$* for param in ${params} do name=$() value=$() if [[ "$name" = "run_type" ...

  4. shell编程简介

    前言 什么是脚本? 脚本简单地说就是一条条的文字命令(一些指令的堆积),这些文字命令是可以看到的(如可以用记事本打开查看.编辑). 常见的脚本: JavaScript(JS,前端),VBScript, ...

  5. Mac git 上传到 github

    上传本地项目到github 1.初始化本地项目 进入到你的项目,根目录下git init,会在你的项目的根目录下多出一个.git的文件夹,也许你的mac隐藏了,但是用命令行或者vscode等工具是可以 ...

  6. Vue 学习(1)

    <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta cha ...

  7. java.lang.IllegalArgumentException: Document base XXX does not exist or is not a readable directory解决方法

    一.配置Eclipse,部署项目 1.双击打开Tomcat设置页面 2.选择Modules模式 3.选择Add External Web Module.. (1)Document base:选择htd ...

  8. 实战ELK(9) Elasticsearch地理位置

    地理坐标点(geo-point) 是指地球表面可以用经纬度描述的一个点.地理坐标点可以用来计算两个坐标位置间的距离,或者判断一个点是否在一个区域中.地理坐标点不能被动态映射(dynamic mappi ...

  9. idea中git常见使用场景

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...

  10. docx httpheader头设置

    设置contentType内容类型如下: Extension MIME Type .doc application/msword .dot application/msword .docx appli ...