Week2:包含 min 函数的栈

2023-09-17 22:12:06

1️⃣ 题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.


2️⃣ 解题思路

  • 分析
    stack的push()pop()时间复杂度都是O(1);但是如果想获得stack中最小的元素,需要遍历整个栈,而遍历栈需要创两个栈,时间复杂度和空间复杂度都是O(n),因此重点就是保证min()的时间复杂度为O(1)

  • 思路

    函数操作
    push()无返回值,所有元素都push到栈A中;当要push的元素小于等于栈B的栈顶元素 or 栈B为空时,就要将该元素push到栈B中
    pop()无返回值,如果栈A的栈顶元素和栈B的栈顶元素相同时,A和B都要pop栈顶元素;否则只有栈A需要pop栈顶元素
    top()有返回值,直接return A.pop()
    min()有返回值,直接return B.pop()

    创建两个栈A和B

    • push():
      所有元素都push到栈A中;
      当要push的元素小于等于栈B的栈顶元素时,就要将该元素push到栈B中:

      对于这句话要考虑两个问题:

      • ①如果栈B为空怎么办?
        如果栈B为空则无法比较,而且只有一开始的时候栈B才可能为空,因此如果栈B为空,则要把要push的元素push到栈B中
      • ②为什么要push的元素等于栈B的栈顶元素时,要push的元素也要入B栈?
        举个例子:如果要push 2 6 1,那么此时栈A为 2 6 1,栈B为2 1,下一个要push的又是1,此时栈A变成2 6 1 1,这个1也要push到栈B中,栈B变为2 1 1。如果栈B还是2 1,那么如果下一个操作是pop(),那么栈A会变成2 6 1,栈B变成2,下一个操作如果是min()的话,结果就成了2,会出错;这就是所谓的非严格降序(非严格:重复的元素也要添加)
    • pop()
      如果栈A的栈顶元素和栈B的栈顶元素相同时,A和B都要pop(还是2 6 1 1这个例子,如果不都pop,结果会出错,自己画一下);注意一下,对于这种情况,需要栈B先pop,栈A再pop,不然会出错,自己画一下

      如果不同,只有栈A需要pop栈顶元素


3️⃣ 代码

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {}
    
    void push(int x) {
        A.push(x);
        if(B.empty()||x<=B.top()){
            B.push(x);
        }
    }
    
    void pop() {
        if(A.top()==B.top()){
            B.pop();
        }
        A.pop();
    }
    
    int top() {
        return A.top();
    }
    
    int min() {
        return B.top();
    }

private:
    stack<int> A,B;
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->min();
 */

更多推荐

写在2023,转行软件测试的我后悔了吗?

前言朋友,作为一个曾经从机械转行到IT的行业的过来人,已在IT行业工作5年,分享一下我的经验,供你参考。讲真,现在想通过培训班培训几个月就进入IT行业,越来越来难了;如果是在2018年以前,还有机会,一方面,那个时候IT行业还不算卷,需求还是蛮大的;但最近这一两年,由于大环境不好,很多互联网大厂都开始裁员了,连科班出身

计算机网络与技术——物理层

😊计算机网络与技术——物理层👻物理层的基本概念👻数据通信基础知识🚢数据通信系统的模型🚢信道的基本概念🚢信道的极限容量👻物理层下面的传输媒体🔊导引型传输媒体🔊非导引型传输媒体👻信道复用技术🥏频分复用、时分复用和统计时分复用🥏波分复用🥏码分复用👻宽带接入技术☃️ADSL技术☃️光纤同轴混合网(H

强强联合,波卡生态正成为物联网赛道关键入口

自5月23日,波卡平行链之一Peaq宣布将特斯拉和去中心化汽车共享应用引入Polkadot生态系统后,其以打造Polkadot上Web3汽车共享的未来为目标,开启物联网发展的新时代;而在近期,Peaq又表示将在9月前往德国慕尼黑IAAMOBILITY2023,作为L1底层架构参与特斯拉和捷豹汽车的现场演示。在这场展示活

什么是边缘计算网关?

边缘计算网关(简称边缘网关)将云端功能扩展到本地的边缘设备,使边缘设备能够快速自主地响应本地事件,提供低延时、低成本、隐私安全、本地自治的本地计算服务。同时所有服务都以Docker镜像方式安装,真正做到了跨平台,部署快捷,易管理。在链路安全,应用场景,云开发组件等也都做到了非常好的支持。涂鸦提供了丰富的物联网协议,客户

985、211高校分布

985、211高校分布985211985全国985大学有39所1、北京市(8所)北京大学、中国人民大学、清华大学、北京航空航天大学、北京理工大学、中国农业大学、北京师范大学、中央民族大学2、天津市(2所)南开大学、天津大学3、辽宁省(2所)大连理工大学、东北大学4、吉林省(1所)吉林大学5、黑龙江省(1所)哈尔滨工业大

批量调整视频饱和度和色度,提升你的视频剪辑效率!

作为一名视频剪辑师,你是否经常为如何高效地调整多个视频的饱和度和色度而烦恼?现在,我们为你提供了一种简单、快速、准确的方法,帮助你轻松解决这个问题!首先我们要进入好简单批量智剪,并在左侧的板块栏里选择“任务剪辑”第二步,进入板块之后,并点击“添加视频”在弹出来的文件框里,将要调整的视频都一一导入。第三步,导入后,所有视

电脑入门:怎么进入路由器设置

怎么进入路由器设置在浏览器地址栏上输入路由器的出厂默认IP地址(192.168.0.1)后按回车。在登录窗口中输入说明书上的密码,点击“Login”按钮进入宽带路由器管理设置界面。管理设置界面分为左右栏,左栏是主菜单,右边则是与之对应的设置内容。请根据自己接入的宽带类型来做出正确的选择。第一项“DynamicIPAdd

MySQL 几种导数据的方法与遇到的问题

零、说在前面MySQL导数据通常使用第三方工具和MySQL自身的工具,本文分别就这两类方法分别介绍。一、第三方工具之Navicat1.1、Navicat的“数据传输”工具打开Navicat,点击“工具”标签,找到“数据传输”,即可看到操作界面。这里不对这个工具本身做过多介绍,侧重点在于工具中的一些配置选项的含义的介绍上

LeetCode每日练习之链表常见题目

1.两个链表的第一个公共节点输入两个链表,找出它们的第一个公共节点。1.1思路哈希和集合,先将一个链表全部存到Map里,然后一边遍历第二个链表,一边检测Hash是否存在当前结点,如果有交点,那么一定能检测出来,使用两个栈,分别将两个链表入栈,然后分别出栈对比,如果相等就出栈,知道找到最晚出栈的那组,拼接两个字符串,将两

【论文记录】Boosting Detection in Crowd Analysis via Underutilized Output Features

BoostingDetectioninCrowdAnalysisviaUnderutilizedOutputFeaturesAbstractCrowdHat使用一种混合的2D-1D压缩技术进行细化空间特征与获取特定人群信息的空间和数量分布。进一步的,CrowdHat采用自适应区域的NMS阈值与一个解耦然后对齐的范式来解

猫眼 面经和答案

你好,我是田哥上一篇文章,给大家分享了几家公司的面经;最新猫眼、阿里云、美团....面经有朋友私聊我,说昨天的这篇文章中,只给出了面试题,没有答案,今天给安排一份猫眼面经的参考答案。在线刷题小程序面试题自我介绍项目用到的技术栈、项目问的比较多,一定要多看三次握手四次挥手缓存穿透和雪崩的原因和解决方法布隆过滤器你了解吗m

热文推荐