设计一个最小栈

news2024/11/15 4:29:54

问题

请你设计一个 最小栈 。它提供 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例 

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[2],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,2,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(2);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 2.
minStack.getMin();   --> 返回 -2.

分析

本题目的难点在于,出了要实现间的栈操作,还得满足在常数时间内找到最小值。因此时间成本要求极高。所以不能进行数据的遍历去找到合适的数值。

因此,我们可以考虑空间换时间的方法。用额外开辟的空间,去换得最小的时间消耗

思路

我们可以建立两个stack,第一个叫st,用来正常出入数据;第二个叫minst,将最小的数入到该栈。

示例:

当我们打算入5 6 7 3时, st作为正常栈,存储5 6 7 3。

当5入栈时,minst为空,5入minst-------->当6 7入栈时,6  7均大于5(minst栈顶),因此入5(保证minst的栈顶始终是最小值)---------->当3入栈时,3小于等于minst.top(),因此3入minst

(需要注意,当插入的元素 x 等于 minst.top()时,仍需要插入)

优化:

为了减少入栈的消耗,在minst中“当6 7入栈时,6  7均大于5(minst栈顶),因此入5(保证minst的栈顶始终是最小值)”此操作省去

因此在需要满足的push、top、pop操作如下:

top:

返回st栈的栈顶

push:

st栈优先插入,当插入的数据x小于等于minst.top()时,minst才插入x

pop:

st栈优先删除,当删除的数据等于minst.top()时,minst才删除。((因为minst.top()始终小于等于st.top()   ))

代码实现

class MinStack {
public:
    MinStack() {    //不写,在初始化列表自动完成初始化
    }
    
    void push(int x) {
        _st.push(x);

        if (_minst.empty() || x <=  _minst.top())
            _minst.push(x);
    }
    
    void pop() {

        if (_minst.top() == _st.top())
            _minst.pop();

        _st.pop();

    }
    
    int top() {
        return _st.top();
    }
    
    int getMin() {
        return _minst.top();
    }

private:
    stack<int> _st;
    stack<int> _minst;

};

题外话

当出现大量重复元素时,minst还需要大量的push这些重复元素吗?

答案是不需要。我们只需要将minst初始化为一个自定义类型即可。

采用类内初始化,建立一个这样的类。当传入相同的元素时,只需要_count++即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昂科烧录器支持MindMotion灵动微电子的微控制器MM32F5333D7P

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中MindMotion灵动微电子的32位微控制器MM32F5333D7P已经被昂科的通用烧录平台AP8000所支持。 MM32F5333D7P微控制器搭载了由安谋科技授权的Armv8-M架构“星辰”STAR-MC1处理器&a…

Redux的中间件原理分析

Redux的中间件原理分析 redux的中间件对于使用过redux的各位都不会感到陌生&#xff0c;通过应用上我们需要的所有要应用在redux流程上的中间件&#xff0c;我们可以加强dispatch的功能。最近抽了点时间把之前整理分析过的中间件有关的东西放在这里分享分享。本文只对中间件涉…

在线客服系统源码 完全开源可二开 带完整的安装代码包以及搭建部署教程

系统概述 在线客服系统是一种基于互联网技术的客户服务解决方案&#xff0c;通过即时通讯工具&#xff0c;如文本聊天、语音通话、视频交流等方式&#xff0c;实现企业与客户之间的实时互动。它打破了传统客服模式的时空限制&#xff0c;使客户能够在任何时间、任何地点获得快…

Java基础(4)- IDEA

目录 一、Module 1.创建module 2.关闭modue 3.导入module 4.src灰色 二、Package 1.创建package 2.删除package 3.package取名规范 三、类 1.创建类 2.快捷语法 3.HelloWorld 四、IDEA基本设置说明 1.字体 2.提示的快捷键 五、常用快捷键 一、Module 1.创建mod…

Python大数据之Hadoop学习——day05_hive基本操作

一.SQL,Hive和MapReduce的关系 用户在hive上编写sql语句&#xff0c;hive把sql语句转为mapreduce程序去执行 二.Hive的架构映射流程 三.MetaStore元数据管理三种模式 metastore服务配置有3种&#xff1a; 内嵌模式、本地模式、远程模式&#xff08;推荐&#xff09; 内嵌模式…

【一文读懂】基于Havenask向量检索+大模型,构建可靠的智能问答服务

Havenask是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎&#xff0c;深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内的几乎整个阿里的搜索业务。本文针对性介绍了Havenask作为一款高性能的召回搜索引擎&#xff0c;应用在向量检索和LLM智能问答场景的解决方案和核心优势…

泰山派小手机---ubuntu 环境的搭建

问题&#xff1a; 本来我的 泰山派的 ubuntu 虚拟机环境已经搭建好了&#xff0c;但是由于一直到捣鼓 neovim &#xff0c;把虚拟机 内核搞崩溃&#xff0c;所以从新安装一下 虚拟机。 过程&#xff1a; 1 首先是 安装虚拟机。 下载镜像。 https://mirrors.ustc.edu.cn/ubu…

密码强度验证——js基础积累

//密码强度等级 getPwdLevel:function (pwd,minLength8) {var level 0;if (pwd.length < minLength) return level;if (/\d/.test(pwd)) level; //数字if (/[a-z]/.test(pwd)) level; //小写if (/[A-Z]/.test(pwd)) level; //大写if (/\W/.test(pwd)) level; //特殊字符ret…

安卓好软-----手机端提取apk的小工具 方便简单 无需root权限

apk提取工具 工具小巧。可以提取手机上面当前安装的apk和系统应用apk。而且无需root权限即可正常使用。 效果非常不错。比其他工具提取系统app方便好使。 下载&#xff1a;https://download.csdn.net/download/mg668/89683199?spm1001.2014.3001.5503

副业赚钱新玩法:大模型也能月入过万?

在这个多元化的时代&#xff0c;副业已经成为了越来越多人的选择。无论是为了实现个人兴趣&#xff0c;还是为了增加收入来源&#xff0c;副业都为我们提供了无限可能。而随着人工智能技术的飞速发展&#xff0c;利用大模型来开展副业也成为了一种新兴的方式。今天&#xff0c;…

日常避坑指南:如何正确使用 aiohttp 上传文件,避免文件被提前关闭

在日常开发中,我们经常会遇到需要上传文件到服务器的场景。如果你选择使用 aiohttp 进行异步请求,上传文件的方式需要特别注意,否则可能会遇到一些令人头疼的问题——比如文件被提前关闭,导致上传失败。这篇文章将为你详细解析这个问题,并提供有效的解决方案,帮助你在开发…

Mysql基础练习题 181.找到收入比经理高的员工 (力扣)

181.找到收入比经理高的员工 建表插入数据&#xff1a; Create table If Not Exists Employee (id int, name varchar(255), salary int, managerId varchar(10)); Truncate table Employee insert into Employee (id, name, salary, managerId) values (1, Joe, 70000, 3); …

/lib64/libm.so.6: version `GLIBC_2.27‘ not found 如何解决?

安装GLIBC_2.27 wget http://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.gz tar xf glibc-2.27.tar.gz cd glibc-2.27/ && mkdir build && cd build ../configure --prefix/usr --disable-profile --enable-add-ons --with-headers/usr/include --with-binutils…

聚观早报 | 智界R7亮相;问界新M7 Pro正式上市

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 8月28日消息 智界R7亮相 问界新M7 Pro正式上市 《全职高手3》动画热播 苹果2024秋季发布会官宣 一加Ace 5 Pro设…

火语言RPA流程组件介绍--播放声音

&#x1f6a9;【组件功能】&#xff1a;播放系统声音或指定的Wav格式声音文件 配置预览 配置说明 来源 系统&#xff1a;播放Windows系统内置声音。 自定义Wav文件&#xff1a;播放本地路径下指定声音文件。 Wav文件 支持T或# 默认FLOW输入项 选择Wav声音文件的本地路径。…

35岁零基础转战AI领域:实现AI大模型开发者职业转型的可能性与路径

以下从3个方面帮大家分析&#xff1a; 35岁转行会不会太晚&#xff1f;零基础学习AI大模型开发能不能学会&#xff1f;AI大模型开发行业前景如何&#xff0c;学完后能不能找到好工作&#xff1f; 一、35岁转行会不会太晚&#xff1f; 35岁正处于人生的黄金时期&#xff0c;拥…

灵魂 20 问帮你彻底搞定Transformer

1.Transformer为何使用多头注意力机制&#xff1f;&#xff08;为什么不使用一个头&#xff09; 捕捉多种依赖关系&#xff1a; 多头注意力机制允许模型同时关注输入数据的不同部分和特征。每个“头”都能够学习输入序列的不同表示子空间&#xff0c;从而捕捉到不同类型的依赖关…

大模型落地难点之结构化输出

应用至上 2023年的世界人工智能大会&#xff08;WAIC&#xff09;是“百模大战”&#xff0c;今年WAIC的关键词是“应用至上”。纵观今年论坛热点话题&#xff0c;无论是具身智能还是AI Agent&#xff08;智能体&#xff09;&#xff0c;都指向以大模型为代表的AI技术在不同场…

一文道尽 RAG,为大模型提供你的私有知识

什么是 RAG&#xff1f;先说一个你可能不相信的事实&#xff1a;RAG 是2005年提出的古老技术&#xff08;论文在此 https://arxiv.org/pdf/2005.11401&#xff09;。然后我们先看一个学术定义&#xff1a;“检索增强生成&#xff08;Retrieval-augmented Generation&#xff09…

【MATLAB源码-第198期】基于simulink的三相光伏并网仿真模拟。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 三相光伏并网系统是一种将太阳能转换为电能并将其馈入电网的系统。这个系统通常包括光伏阵列、逆变器&#xff08;包括其控制算法&#xff09;、滤波器、电网连接和监控系统。从上载的框图中可以看出&#xff0c;该系统的设计…