zoukankan      html  css  js  c++  java
  • 《剑指Offer》第20题(Java实现):定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

    一、题目描述

      定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的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();
    }
    }

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

  • 相关阅读:
    JAVA联调接口跨域解决办法
    Quartz集成springMVC 的方案二(持久化任务、集群和分布式)
    Quartz集成springMVC 的方案一
    Java 常调用的Webservice接口的方法
    集成Dubbo服务(Spring)
    Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
    事务的隔离级别 数据库
    Spring 之注解事务 @Transactional
    Request To JavaBean(请求对象转换为JavaBean对象)
    springmvc+mongodb+maven 项目搭建配置
  • 原文地址:https://www.cnblogs.com/xwwbb/p/10690945.html
Copyright © 2011-2022 走看看