Week2:包含 min 函数的栈

2023-11-01

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();
 */

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Week2:包含 min 函数的栈 的相关文章

随机推荐

  • Jenkins自动构建部署项目(springboot+maven+svn)jar包启动方式(java -jar 包.jar)

    我的环境 linux centos6 5 jdk1 8 maven3 5 svn 第一步 安装必要插件 Deploy to container Plugin 部署到容器插件 Publish Over SSH 通过SSH发送构建构件 Buil
  • Hadoop学习——简单介绍及单点配置步骤(2018012-10补充)

    Hadoop介绍 Hadoop是一个开源的 可靠的 可扩展的系统架构 可利用分布式架构来存储海量数据 以及实现分布式的计算 Doug Cutting是创始人 同时也联合开发了Lucence Nutch Hadoop作用简概 存储海量数据 计
  • windows系统怎么用注册表修改桌面文件路径

    方法 步骤 1 调出运行窗口 输入regedit命令后回车打开注册表 2 在打开的注册表界面中依次展开以下路径 如图所示 HKEY CURRENT USER Software Microsoft Windows CurrentVersion
  • 【模型压缩】网络层与算子融合

    由于深度学习网络层数深 结构复杂 生成的算子数量众多 带了巨大的计算资源在和时间的消耗 业界对于加速算子的计算展开了一定研究 比较经典的方法是将多个算子重新组合成一个新的算子 同时对生成的代码进行底层的性能优化 融合成新算子后计算相对于多个
  • 字节的测试面试题,你觉得很难吗?不是有手就行....

    年前的时候 我的一个粉丝跟我说 他在面试美团的自动化测试岗的时候 不幸挂掉了 越想越可惜 回想面试经过 好好总结了几个点 发现面试没过的主要原因是在几个关键的问题没有给到面试官想要的答案 字节的面试会问些什么问题呢 他给我的留言是这样的 根
  • QT调用第三方dll (Lib方式)

    在项目的 pro文件中 增加一句 LIBS L D qtsrc myproject lmydll 在 cpp文件中 声明mydll dll里面导出的函数 extern C int add int a int b int subtract i
  • PYTHON实现自动发送邮件(QQ,163,139三种邮箱演示)

    测试文件与代码结构 一 QQ邮箱发送邮件 大致步骤 1 登录qq邮箱 选择设置 2 点击账户 进入设置界面 3 授权 生成授权码 4 编写发送代码 密码使用的是授权生成的代码 保证发送邮箱的SMTP功能是开启的 5 效果展示 发送代码 1
  • jupyter中图片显示

    文章目录 jupyter notebook中图片显示 1 html方式 2 PIL图片显示 3 opencv图片显示 4 Ipython 方式 jupyter notebook中图片显示 以下用多种方式 其中第一种和第四种方便查看图片 代码
  • chmod命令原理及用法详解

    Chmod命令主要用于修改 设置文件权限 chmod 修改文件权限主要有两种方式 字母法与数字法 虽然数字法相对字母法简单 但是数字法是基于字母法 所以这里先介绍字母法 1 字母法 chmod u g o a r w x 文件名 以上是ch
  • Linux-应用编程-学习总结(3):进程间通信(上)

    Linux 应用编程 学习总结 3 进程间通信 上 前言 进程间通信相关概念 管道 管道的概念 管道的原理 管道的局限性 创建匿名管道 fifo 有名管道 特点 使用场景 创建方式 内存映射区 前言 这次对进程间通信进行总结 上一篇文章以及
  • 微信开放平台【第三方平台】java开发总结:预授权码(pre_auth_code)(三)

    微信第三方平台预授权码 pre auth code 开发说明 全网最详细的微信第三方平台预授权码开发说明 预授权码 预授权码 pre auth code 是第三方平台方实现授权托管的必备信息 每个预授权码有效期为 10 分钟 需要先获取令牌
  • XMPP客户端库Smack 4.1.4版官方开发文档之二

    本文转载自 博客主页 http blog csdn net chszs 三 Smack库的组成 Smack库可以内嵌到任意的Java应用程序中 Smack库有数个JAR文件组成 非常具有灵活性 1 smack core jar 提供了核心X
  • 这是mybatis最简单的入门

    这里有一个demo 这是mybatis最简单的入门 使用的IDE为idea 是maven的哦 这篇只是很简单的一个查询demo 目标是ssm 先来pom文件 这个不知道在网上哪里找的 lt gt
  • 自定义限制接口访问次数(ExpiringMap)

    ExpiringMap简介 它具有高性能 低开销 零依赖 线程安全 使用ConcurrentMa的实现过期entries等优点 主要特点包括 过期策略 可变有效期 最大尺寸 侦听器过期 延迟输入加载 过期自省 可设置Map中的Entry在一
  • python opencv旋转,Python OpenCV cv2.rotate()用法及代码示例

    OpenCV Python是旨在解决计算机视觉问题的Python绑定库 cv2 rotate 方法用于将2D数组旋转90度的倍数 函数cv rotate以三种不同的方式旋转数组 用法 cv2 cv rotate src rotateCode
  • Pandas 三大对象

    1 pandas的Series对象 pandas的Series对象是一个带索引数据构成的一维数组 可以用一个数组创建Series对象 import pandas as pd data pd Series 0 25 0 5 0 75 1 0
  • 为你的嵌入式设计选择合适的低功耗处理器

    在早期 获得低功耗的CPU通常意味着牺牲功能 以降低的时钟速度运行或等待新的低功耗处理技术以降低待机 和有功功耗 无论如何 情况已不再如此 并且处理器领域已经发生了戏剧性的变化 随着处理技术的进步以及创新的芯片设计和高粒度电源管理软件 带来
  • Python2.7.16安装(Ubuntu16.04)

    Python2 7 16安装 Ubuntu16 04 前面的文章已经介绍了在Windows上安装Python2和Python3了 现在介绍Linux系统上的安装 Ubuntu16 04上默认安装了Python2 7和Python3 5 Re
  • HTML 文件中引入高德地图

    准备工作 1 在高德开放平台 注册开发者账号 2 登陆之后 进入 应用管理 点击 我的应用 选择右上角 创建新应用 3 为应用添加 Key 在 服务平台 一项选择 Web 端 JSAPI 页面实现 1 创建一个div 作为地图的容器 2 设
  • Week2:包含 min 函数的栈

    1 题目描述 定义栈的数据结构 请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中 调用 min push 及 pop 的时间复杂度都是 O 1 示例 MinStack minStack new MinStack minSta