热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

保存最小值得栈MinStack

为什么80%的码农都做不了架构师?问题:Designastackthatsupportspush,pop,top,andretrievingthe

为什么80%的码农都做不了架构师?>>>   hot3.png

问题:

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

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • getMin() -- Retrieve the minimum element in the stack.

Example:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> Returns -3.
minStack.pop();
minStack.top(); --> Returns 0.
minStack.getMin(); --> Returns -2.

解决:

【注】要实现上面四个函数。

① 大体上与传统的stack相同,不同的是getMin方法,得到所有栈中数据的最小值;使用两个栈,一个保存正常数据,另一个保存最小值。

public class MinStack { // 117ms
    private Stack s1 &#61; new Stack<>();//直接存储
    private Stack s2 &#61; new Stack<>();//存放每次比较时较小的数
    /** initialize your data structure here. */
    public MinStack() {}
    public void push(int x) {
        s1.push(x);
        if(s2.isEmpty() || s2.peek() >&#61; x) s2.push(x);
    }
    public void pop() { //第一次POP出的数值若为最小值&#xff0c;则它之下的一个数还是最小值&#xff0c;也需要POP
        int x &#61; s1.pop();
        if(s2.peek() &#61;&#61; x) s2.pop();
        //不能使用s2.peek() &#61;&#61; s1.peek()进行比较&#xff0c;因为peek方法返回对象的类型是Object&#xff0c;
        //使用&#61;&#61;比较无效&#xff0c;因为它们返回的是两个不同的对象
    }
    public int top() {
        return s1.peek();
    }
    public int getMin() {
        return s2.peek();
    }
}
/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj &#61; new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 &#61; obj.top();
 * int param_4 &#61; obj.getMin();
 */

② 只使用栈保存数据&#xff0c;使用一个变量保存最小值。

public class MinStack { // 147ms
    private Stack s &#61; new Stack<>();
    private int minVal &#61; Integer.MAX_VALUE;
    public MinStack(){}
    public void push(int x){
        if(x <&#61; minVal){
            s.push(minVal);
            minVal &#61; x;
        }
        s.push(x);
    }
    public void pop(){
        if(s.pop() &#61;&#61; minVal) minVal &#61; s.pop();
    }
    public int top(){
        return s.peek();
    }
    public int getMin(){
        return minVal;
    }
}

③ 自己编写StackNode类&#xff0c;在自己编写的stackNode中加入了最小值&#xff0c;可以减少判断

public class MinStack { //115ms
    StackNode head &#61; null;
    /** initialize your data structure here. */
    public MinStack() {}
    public void push(int x) {
        if (head&#61;&#61;null){
            head &#61; new StackNode(x,x);
        }else{
            StackNode newHead &#61; new StackNode(x,Math.min(head.min,x));
            newHead.next &#61; head;
            head &#61; newHead;
        }
    }
    public void pop() {
        head &#61; head.next;
    }
    public int top() {
        return head.val;
    }
    public int getMin() {
        return head.min;
    }
    class StackNode{
        int val;
        int min;
        StackNode next &#61; null;
        public StackNode(int v,int min) {
            this.val &#61; v;
            this.min &#61; min;
        }
    }
}


转:https://my.oschina.net/liyurong/blog/1511264



推荐阅读
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • 在Qt框架中,信号与槽机制是一种独特的组件间通信方式。本文探讨了这一机制相较于传统的C风格回调函数所具有的优势,并分析了其潜在的不足之处。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • 在尝试使用 Android 发送 SOAP 请求时遇到错误,服务器返回 '无法处理请求' 的信息,并指出某个值不能为 null。本文探讨了可能的原因及解决方案。 ... [详细]
  • 本文详细介绍了Windows网络编程中常用的几个关键结构体,包括sockaddr_in、in_addr和hostent,解释了它们的定义和用途,并提供了实际应用中的示例。 ... [详细]
  • 使用QT构建基础串口辅助工具
    本文详细介绍了如何利用QT框架创建一个简易的串口助手应用程序,包括项目的建立、界面设计与编程实现、运行测试以及最终的应用程序打包。 ... [详细]
  • 线段树详解与实现
    本文详细介绍了线段树的基本概念及其在编程竞赛中的应用,并提供了一个具体的线段树实现代码示例。 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • 本文详细介绍如何在华为鲲鹏平台上构建和使用适配ARM架构的Redis Docker镜像,解决常见错误并提供优化建议。 ... [详细]
  • GLiHT数据介绍
    GLiHT数据介绍 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
author-avatar
气质沫儿巛1314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有