热门标签 | 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



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
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社区 版权所有