LeetCode 热题 100_最小栈(70_155_中等_C++)(栈)(辅助栈)(栈中的push和emplace对比)

news/2025/3/4 19:55:01/

LeetCode 热题 100_最小栈(70_155)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(辅助栈):
      • 代码实现
        • 代码实现(思路一(辅助栈)):
        • 以思路一为例进行调试
        • 部分代码解读

题目描述:

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

实现 MinStack 类:

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

输入输出样例:

示例 1:
输入
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]

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

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

提示:
-231 <= val <= 231 - 1
pop、top 和 getMin 操作总是在 非空栈 上调用
push, pop, top, and getMin最多被调用 3 * 104

题解:

解题思路:

思路一(辅助栈):

1、根据题目的要求,此问题需要对应入栈元素和当前元素存入栈时的最小值,这里不能用一个min变量来存储。因在出栈时,一个min变量不方便更新栈顶元素的最小值。所以我们采用一个额外的栈来存储当前栈中的最小值。
官方题解链接(讲解的还是不错的)

2、复杂度分析:
① 时间复杂度:O(1)。插入、删除与读取操作都是 O(1)。
② 空间复杂度:O(n),其中 n 为总操作数。最坏情况下,我们会连续插入 n 个元素,此时两个栈占用的空间为 O(n)。

代码实现

代码实现(思路一(辅助栈)):
class MinStack {private:stack<int> val_stack;  // 用于存储栈中的所有元素stack<int> min_stack;  // 用于存储每次压入元素后的最小值public:// 构造函数,初始化时将最小栈设置为一个非常大的值(为了统一入栈操作)MinStack() {min_stack.emplace(INT_MAX);  // 设置一个非常大的初始值作为最小值}// 将元素压入栈中,并更新最小栈(每一个值对应一个压入栈中的最小值)void push(int val) {val_stack.emplace(val);  // 将元素压入值栈// 更新最小栈,最小栈的栈顶为当前值和之前栈顶最小值中的较小值min_stack.emplace(min(min_stack.top(), val));  }// 弹出栈顶元素,并更新最小栈void pop() {val_stack.pop();  // 弹出值栈的栈顶元素min_stack.pop();  // 弹出最小栈的栈顶元素}// 获取栈顶元素int top() {return val_stack.top();  // 返回值栈的栈顶元素}// 获取当前栈中的最小值int getMin() {return min_stack.top();  // 返回最小栈的栈顶元素,即当前栈中的最小值}
};
以思路一为例进行调试
#include<iostream>
#include<vector>
#include <stack>
using namespace std;class MinStack {private:stack<int> val_stack;  // 用于存储栈中的所有元素stack<int> min_stack;  // 用于存储每次压入元素后的最小值public:// 构造函数,初始化时将最小栈设置为一个非常大的值(为了统一入栈操作)MinStack() {min_stack.emplace(INT_MAX);  // 设置一个非常大的初始值作为最小值}// 将元素压入栈中,并更新最小栈(每一个值对应一个压入栈中的最小值)void push(int val) {val_stack.emplace(val);  // 将元素压入值栈// 更新最小栈,最小栈的栈顶为当前值和之前栈顶最小值中的较小值min_stack.emplace(min(min_stack.top(), val));  }// 弹出栈顶元素,并更新最小栈void pop() {val_stack.pop();  // 弹出值栈的栈顶元素min_stack.pop();  // 弹出最小栈的栈顶元素}// 获取栈顶元素int top() {return val_stack.top();  // 返回值栈的栈顶元素}// 获取当前栈中的最小值int getMin() {return min_stack.top();  // 返回最小栈的栈顶元素,即当前栈中的最小值}
};int main(int argc, char const *argv[])
{MinStack minStack  ;minStack .push(-2);minStack .push(0);minStack .push(-3);cout<<minStack.getMin()<<endl;      // --> 返回 -3.minStack.pop();cout<<minStack.top()<<endl;         //--> 返回 0.cout<<minStack.getMin()<<endl;     //--> 返回 -2.return 0;
}
部分代码解读

栈中的push和emplace对比

stack<int> val_stack;
val_stack.emplace(val);
val_stack.push(val);

push 会通过拷贝或移动操作将元素压入栈。
emplace 会在栈内部直接构造元素,通常能避免不必要的拷贝或移动操作。可以避免不必要的拷贝或移动,效率上会有所提升

LeetCode 热题 100_最小栈(70_155)原题链接
欢迎大家和我沟通交流(✿◠‿◠)


http://www.ppmy.cn/news/1576624.html

相关文章

基于 MetaGPT 自部署一个类似 MGX 的多智能体协作框架

MGX&#xff08;由 MetaGPT 团队开发的 mgx.dev&#xff09;是一个收费的多智能体编程平台&#xff0c;提供从需求分析到代码生成、测试和修复的全流程自动化功能。虽然 MGX 本身需要付费&#xff0c;但您可以通过免费服务和开源项目搭建一个类似的功能。以下是一个分步骤的实现…

GPT-4.5 怎么样?如何升级使用ChatGPTPlus/Pro? GPT-4.5设计目标是成为一款非推理型模型的巅峰之作

GPT-4.5 怎么样&#xff1f;如何升级使用ChatGPTPlus/Pro? GPT-4.5设计目标是成为一款非推理型模型的巅峰之作 今天我们来说说上午发布的GPT-4.5&#xff0c;接下来我们说说GPT4.5到底如何&#xff0c;有哪些功能&#xff1f;有哪些性能提升&#xff1f;怎么快速使用到GPT-4.…

PDF文档中表格以及形状解析

我们在做PDF文档解析时有时需要解析PDF文档中的表格、形状等数据。跟解析文本类似的常见的解决方案也是两种。文档解析跟ocr技术处理。下面我们来看看使用文档解析的方案来做PDF文档中的表格、图形解析&#xff08;使用pdfium库&#xff09;。 表格解析&#xff1a; 在pdfium库…

【算法】【优选算法】滑动窗口(下)

目录 一、904.⽔果成篮1.1 滑动窗口1.2 暴力枚举 二、438.找到字符串中所有字⺟异位词2.1 滑动窗口2.2 暴力枚举 三、30.串联所有单词的⼦串3.1 滑动窗口3.2 暴力枚举 四、76.最⼩覆盖⼦串4.1 滑动窗口4.2 暴力枚举 一、904.⽔果成篮 题目链接&#xff1a;904.⽔果成篮 题目描…

iOS for...in 循环

0x00 循环遍历一 输出结果是什么&#xff1f; NSMutableArray *marr [1, 2, 3].mutableCopy; for (NSNumber *number in marr) {NSLog("%", number);marr [4, 5, 6].mutableCopy; } NSLog("%", marr);0x01 循环遍历二 输出结果是什么&#xff1f; NS…

【后端开发面试题】每日 3 题(五)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12903849.html &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享后端开发面试中常见的面试题给大家~ ❤️如果有收获的话&#x…

微服务,服务治理nacos,负载均衡LOadBalancer,OpenFeign

1.微服务 简单来说&#xff0c;微服务架构风格[1]是一种将一个单一应用程序开发为一组小型服务的方法&#xff0c;每个服务运行在 自己的进程中&#xff0c;服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并 且可通过全自动部署机制独立部署。这…

基于AT89C52单片机的停车场车位管理系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/90441636?spm1001.2014.3001.5501 C18 部分参考设计如下&#xff1a; 摘要 随着科技的快速发展&#xff0c;交通工具的普及程度和汽车保有量的急剧增加&#xf…