Min Stack

Min Stack

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.

分析:设计一个堆栈支持push,pop,top以及以常数时间检索里面的最小元素

思路:

 1、用两个stack来解决:第一个stack用来正常进行stack的push,pop和top操作;另外一个min_stack用来存储最小元素.每次对stack进行pop或者push时,也对min_stack进行相应操作。

2、 第二个min_stack可以进行优化:不一定每个最小元素都要入栈min_stack, push的时候,只入栈比当前min小或者相等的值就可以了。pop的时候,要比较待pop元素和min_stack中top的大小。如果待pop元素和min_stack的top元素相等,则将min stack进行pop。

代码如下:

class MinStack {  
private:  
    std::stack<int> stack;  
    std::stack<int> min_stack;  
public:  
    void push(int x) {  
        stack.push(x);  
        if (min_stack.empty() || ((!min_stack.empty()) && x <= min_stack.top())) {  //NOTE: 是“小于等于”,不是“小于”  
            min_stack.push(x);  
        }  
    }  
      
    void pop() {  
        if (!stack.empty()) {  
            if (stack.top() == min_stack.top())  
                min_stack.pop();  
            stack.pop();  
        }  
    }  
      
    int top() {  
        if (!stack.empty())  
            return stack.top();  
    }  
      
    int getMin() {  
        if (!min_stack.empty())  
            return min_stack.top();  
    }  
};  

 或:

class MinStack {
public:
    void push(int x) {
        if (stk1.empty() || x <= stk2.top())
            stk2.push(x);
        stk1.push(x);
    }

    void pop() {
        if (stk1.top() == stk2.top())
            stk2.pop();
        stk1.pop();
    }

    int top() {
        return stk1.top();
    }

    int getMin() {
        return stk2.top();
    }
private:
    stack<int> stk1; 
    stack<int> stk2;
};

  或者:using two vectors

class MinStack {
public:
    vector<int> stack; 
    vector<int> stmin = {INT_MAX};
    void push(int x) {
        if(x <= stmin[stmin.size() - 1]) stmin.push_back(x);
        stack.push_back(x);
    }

    void pop() {
        if(stack[stack.size() - 1] == stmin[stmin.size() - 1]) stmin.pop_back();
        stack.pop_back();
    }

    int top() {
        if(stack.size() == 0) return 0;
        return stack[stack.size() - 1];
    }

    int getMin() {
        return stmin[stmin.size() - 1];
    }
}; 

  

转载于:https://www.cnblogs.com/carsonzhu/p/4684558.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109380.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++中decltype与左值和右值「建议收藏」

    1decltype关键字decltype是C++11中引入的新的类型说明符。编译器根据分析表达式或者函数返回值来分析其类型。decltype的详细用法,请参考《C++中decltype的使用方法》2decltype与左值和右值decltype后面跟的表达式是左值或者右值时,编译器分析的类型会有所不同。如果表达式(非单个变量)的求值结果是左值,则编译器会得到一个引用类型;如果表达式(非单个变量)的求值结果是右值,则编译器会得到一个与表达式相同的类型。intarr[2]={10,2.

    2022年4月8日
    86
  • VMware 虚拟机的三种网络连接方式「建议收藏」

    VMware 虚拟机的三种网络连接方式「建议收藏」VMware的虚拟机有三种网络连接方式,分别是桥接(Bridged)模式、NAT模式和仅主机(Host-only)模式。在安装VMware之后,宿主机上会出现几个相关的虚拟设备,每个设备的功能如下:VMnet0:桥接(Bridge)模式下的虚拟交换机。VMnet1:仅主机(Host-only)模式下的虚拟交换机。VMnet8:NAT模式下的虚拟交换机。VMwareNetworkAdapterVMnet1:宿主机与Host-only虚拟网络进行通信的虚拟网卡。VMwareN

    2022年6月20日
    42
  • Android应用程序开发以及背后的设计思想深度剖析

    Android应用程序开发以及背后的设计思想深度剖析原文链接:http://www.uml.org.cn/mobiledev/201211063.asp#2初步过了一下,很多地方写得还是比较深入的,先转载,后面再仔细看看。 本文内容,主题是透过应用程序来分析Android系统的设计原理与构架。我们先会简单介绍一下Android里的应用程序编程,然后以这些应用程序在运行环境上的需求来分析出,为什么我们的Android系统需要今天这样的设

    2022年6月20日
    36
  • noip2014普及组复赛试题_大一高数期末考试试题

    noip2014普及组复赛试题_大一高数期末考试试题T1考察计算机基础知识,所谓集成电路是将大量的晶体管和电子线路组合在一块硅片上,故又称为芯片。故选AAA。T2HTMLHTMLHTML超文本标记语言阅读方式是浏览器,浏览器主要用于显示网页服务器。T3英特尔公司是全球最大的个人计算机零件和CPU制造商。T4TCP/IP模型AAA项最符合该图形式。T5快速排序的期望复杂度是O(nlogn)O(nlogn)O(nlogn)的,最坏情况(已经排好序的序列)是O(n2)O(n^2)O(n2)的。T6第一代:电子管计算机第二代:晶体管计

    2022年8月22日
    5
  • 固态硬盘数据丢失能恢复吗?含泪分享:固态硬盘数据恢复方法

    固态硬盘数据丢失能恢复吗?含泪分享:固态硬盘数据恢复方法固态硬盘数据丢失能恢复吗?有些时候又是数据无缘无故丢失导致我们一头雾水的同时又手足无措。其实不论是固态硬盘,还是什么其他电子设备,数据丢失也是可以恢复的。固态硬盘的话,除非芯片被损坏或烧毁。那么点进来看看恢复的方法吧!…

    2022年9月20日
    2
  • C# winform美化窗体

    C# winform美化窗体记录一下winform美化工具CSkin一个.Net的UI库。参考链接:https://blog.csdn.net/yyl7727/article/details/78904125?spm=1001.2014.3001.5502

    2022年5月24日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号