当前位置: 首页 > news >正文

30. 包含 min 函数的栈


comments: true
difficulty: 简单
edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9830.%20%E5%8C%85%E5%90%ABmin%E5%87%BD%E6%95%B0%E7%9A%84%E6%A0%88/README.md

面试题 30. 包含 min 函数的栈

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.

 

提示:

  1. 各函数的调用总次数不超过 20000 次

 

注意:本题与主站 155 题相同:https://leetcode.cn/problems/min-stack/

解法

方法一:双栈

我们用两个栈来实现,其中stk1 用来存储数据,stk2 用来存储当前栈中的最小值。初始时,stk2 中存储一个极大值。

  • 当我们向栈中压入一个元素 x 时,我们将 x 压入 stk1,并将 min(x, stk2[-1]) 压入 stk2
  • 当我们从栈中弹出一个元素时,我们将 stk1stk2 的栈顶元素都弹出。
  • 当我们要获取当前栈中的栈顶元素时,我们只需要返回 stk1 的栈顶元素即可。
  • 当我们要获取当前栈中的最小值时,我们只需要返回 stk2 的栈顶元素即可。

时间复杂度:对于每个操作,时间复杂度均为 O ( 1 ) O(1) O(1),空间复杂度 O ( n ) O(n) O(n)

Python3
class MinStack:def __init__(self):self.stk1 = []self.stk2 = [inf]def push(self, x: int) -> None:#难点:stk2每个位置的元素,对应 stk1对应位置元素 至 栈地元素的 最小值self.stk1.append(x)self.stk2.append(min(x, self.stk2[-1]))def pop(self) -> None:self.stk1.pop() # 1 2 3 0 0 5(顶)self.stk2.pop() # 1 1 1 0 0 0(顶)def top(self) -> int:return self.stk1[-1]def getMin(self) -> int:return self.stk2[-1]# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
Java
class MinStack {private Deque<Integer> stk1 = new ArrayDeque<>();private Deque<Integer> stk2 = new ArrayDeque<>();/** initialize your data structure here. */public MinStack() {stk2.push(Integer.MAX_VALUE);}public void push(int x) {stk1.push(x);stk2.push(Math.min(x, stk2.peek()));}public void pop() {stk1.pop();stk2.pop();}public int top() {return stk1.peek();}public int getMin() {return stk2.peek();}
}/*** 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.getMin();*/
C++
class MinStack {
public:/** initialize your data structure here. */MinStack() {stk2.push(INT_MAX);}void push(int x) {stk1.push(x);stk2.push(min(x, stk2.top()));}void pop() {stk1.pop();stk2.pop();}int top() {return stk1.top();}int getMin() {return stk2.top();}private:stack<int> stk1;stack<int> stk2;
};/*** 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->getMin();*/
Go
type MinStack struct {stk1 []intstk2 []int
}/** initialize your data structure here. */
func Constructor() MinStack {return MinStack{[]int{}, []int{math.MaxInt32}}
}func (this *MinStack) Push(x int) {this.stk1 = append(this.stk1, x)this.stk2 = append(this.stk2, min(x, this.stk2[len(this.stk2)-1]))
}func (this *MinStack) Pop() {this.stk1 = this.stk1[:len(this.stk1)-1]this.stk2 = this.stk2[:len(this.stk2)-1]
}func (this *MinStack) Top() int {return this.stk1[len(this.stk1)-1]
}func (this *MinStack) GetMin() int {return this.stk2[len(this.stk2)-1]
}/*** Your MinStack object will be instantiated and called as such:* obj := Constructor();* obj.Push(x);* obj.Pop();* param_3 := obj.Top();* param_4 := obj.GetMin();*/
TypeScript
class MinStack {stack: number[];mins: number[];constructor() {this.stack = [];this.mins = [];}push(x: number): void {this.stack.push(x);this.mins.push(Math.min(this.getMin(), x));}pop(): void {this.stack.pop();this.mins.pop();}top(): number {return this.stack[this.stack.length - 1];}getMin(): number {return this.mins.length == 0 ? Infinity : this.mins[this.mins.length - 1];}
}/*** Your MinStack object will be instantiated and called as such:* var obj = new MinStack()* obj.push(x)* obj.pop()* var param_3 = obj.top()* var param_4 = obj.getMin()*/
Rust
use std::collections::VecDeque;
struct MinStack {stack: VecDeque<i32>,min_stack: VecDeque<i32>,
}/*** `&self` means the method takes an immutable reference.* If you need a mutable reference, change it to `&mut self` instead.*/
impl MinStack {/** initialize your data structure here. */fn new() -> Self {Self {stack: VecDeque::new(),min_stack: VecDeque::new(),}}fn push(&mut self, x: i32) {self.stack.push_back(x);if self.min_stack.is_empty() || *self.min_stack.back().unwrap() >= x {self.min_stack.push_back(x);}}fn pop(&mut self) {let val = self.stack.pop_back().unwrap();if *self.min_stack.back().unwrap() == val {self.min_stack.pop_back();}}fn top(&self) -> i32 {*self.stack.back().unwrap()}fn get_min(&self) -> i32 {*self.min_stack.back().unwrap()}
}
JavaScript
/*** initialize your data structure here.*/
var MinStack = function () {this.stack = [];this.minStack = [];
};/*** @param {number} x* @return {void}*/
MinStack.prototype.push = function (x) {this.stack.unshift(x);if (!this.minStack.length || this.minStack[0] >= x) {this.minStack.unshift(x);}
};/*** @return {void}*/
MinStack.prototype.pop = function () {if (this.stack.shift() === this.minStack[0]) {this.minStack.shift();}
};/*** @return {number}*/
MinStack.prototype.top = function () {return this.stack[0];
};/*** @return {number}*/
MinStack.prototype.min = function () {return this.minStack[0];
};/*** Your MinStack object will be instantiated and called as such:* var obj = new MinStack()* obj.push(x)* obj.pop()* var param_3 = obj.top()* var param_4 = obj.min()*/
C#
public class MinStack {private Stack<int> stk1 = new Stack<int>();private Stack<int> stk2 = new Stack<int>();/** initialize your data structure here. */public MinStack() {stk2.Push(int.MaxValue);}public void Push(int x) {stk1.Push(x);stk2.Push(Math.Min(x, GetMin()));}public void Pop() {stk1.Pop();stk2.Pop();}public int Top() {return stk1.Peek();}public int GetMin() {return stk2.Peek();}
}/*** 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.GetMin();*/
Swift
class MinStack {private var stack: [Int]private var minStack: [Int]init() {stack = []minStack = [Int.max]}func push(_ x: Int) {stack.append(x)minStack.append(min(x, minStack.last!))}func pop() {stack.removeLast()minStack.removeLast()}func top() -> Int {return stack.last!}func getMin() -> Int {return minStack.last!}
}/*** Your MinStack object will be instantiated and called as such:* let obj = MinStack();* obj.push(x);* obj.pop();* let param_3 = obj.top();* let param_4 = obj.getMin();*/

相关文章:

30. 包含 min 函数的栈

comments: true difficulty: 简单 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9830.%20%E5%8C%85%E5%90%ABmin%E5%87%BD%E6%95%B0%E7%9A%84%E6%A0%88/README.md 面试题 30. 包含 min 函数的栈 题目描述 定义栈的数据结构&#xff…...

五、OpenTK图形渲染基础

文章目录 一、顶点数据(一)顶点坐标、颜色、纹理坐标的定义(二)顶点数组的组织二、图元绘制(一)点列表、线列表、线带、三角形列表、三角形带的绘制(二)绘制模式(GL_POINTS、GL_LINES、GL_TRIANGLES 等)三、清除屏幕一、顶点数据 (一)顶点坐标、颜色、纹理坐标的定…...

桔子哥/基于云快充协议1.5版本的充电桩系统软件-充电桩系统 -新能源车充电平台源码

基于云快充协议1.5版本的充电桩系统软件 介绍 SpringBoot 框架&#xff0c;充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5-1.6协议新能源汽车二轮车公交车二轮车充电-四轮车充电充电源代码充电平台源码Java源码 软件功能 小程序端&#xff1a;城市切换、附…...

零基础5分钟上手亚马逊云科技-高可用Web系统设计最佳实践

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…...

培训学校课程管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…...

基于STM32的智能婴儿床控制系统设计(手机APP+蓝牙无线控制)(210)

文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】HC05工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】项目背景【5】摘要1.4 开发工具的选择【1】设备端开发【2】上…...

四、前后端分离通用权限系统(4)

&#x1f33b;&#x1f33b; 目录 一、前端开发和前端开发工具1.1、前端开发介绍1.2、下载和安装 VS Code1.2.1、下载地址1.2.2、插件安装1.2.3、创建项目1.2.4、保存工作区1.2.5、新建文件夹和网页1.2.6、预览网页1.2.7、设置字体大小 二、Node.js2.1、Node.js 简介2.1.1、什么…...

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 文章目录 前言时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 一、BO-CNN-BiGRU-Attention模型1. 贝叶斯优化&#…...

计算机毕业设计PySpark+Flask bilibili弹幕情感分析 B站视频数据可视化 B站爬虫 机器学习 深度学习 NLP自然语言处理 大数据毕业设计

### 开题报告&#xff1a;基于PySpark和Flask的B站弹幕情感分析系统 #### 一、研究背景 在网络视频平台的用户互动中&#xff0c;弹幕&#xff08;Danmaku&#xff09;作为一种实时评论的形式&#xff0c;已经成为观众表达观点和情感的重要方式。尤其是在B站&#xff08;哔哩…...

点击展开详细说明网站html引导页源码

点击展开详细说明网站html引导页源码,源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 https://download.csdn.net/download/huayula/89…...

Android 架构模式之 MVP

目录 架构设计的目的对 MVP 的理解代码ModelViewPresenter Android 中 MVP 的问题试吃个小李子ModelViewPresenter 大家好&#xff01; 作为 Android 程序猿&#xff0c;你有研究过 MVP 架构吗&#xff1f;在开始接触 Android 那一刻起&#xff0c;我们就开始接触 MVC 架构&am…...

Ciallo~(∠・ω・ )⌒☆第二十二篇 入门request请求库使用

请求库是用于发送HTTP请求的工具。常见的请求库有requests&#xff0c;它是一个功能强大且易于使用的HTTP库。 使用requests库发送GET请求&#xff1a; import requests url "https://httpbin.org/get"# 携带get请求参数 params {"pn": 10,"size&q…...

设计模式-创建型模式-原型模式

1.原型模式定义 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象&#xff1b; 1.1 原型模式优缺点 优点 当创建一个新的对象实例较为复杂时&#xff0c;使用原型模式可以简化对象的创建过程&#xff0c;通过复制一个已有的实例…...

遗传算法与深度学习实战(7)——使用遗传算法解决N皇后问题

遗传算法与深度学习实战&#xff08;7&#xff09;——使用遗传算法解决N皇后问题 0. 前言1. N 皇后问题2. 解的表示3. 遗传算法解决 N 皇后问题小结系列链接 0. 前言 进化算法 (Evolutionary Algorithm, EA) 和遗传算法 (Genetic Algorithms, GA) 已成功解决了许多复杂的设计…...

R语言:如何安装包“linkET”

自己在R语言中安装包“linkET”时报错不存在叫‘linket’这个名字的程辑包 尝试了install.packages("linkET")和BiocManager::install("linkET")两种安装办法都不行 >install.packages("linkET") WARNING: Rtools is required to build R pa…...

JSON, YAML, XML, CSV交互可视化

1、jsoncrack https://jsoncrack.com/editor...

Android UI:PopupWindow:源码分析:设置WindowManager.LayoutParams中的各种参数

文章目录 设置flags是否包含某些flag设置gravity设置type设置softInputMode设置windowAnimations设置width/height设置token 在WindowManager.addView之前设置在WindowManager.addView之后,可通过i熬夜难过update方法设置设置format设置flags是否包含某些flag 1666 …...

MySQL:从入门到放弃

基础查询 MySQL&#xff1a;基础查询 Mybatis&#xff1a;基础巩固-DDL 项目实战 MySQL&#xff1a;按照日期分组查询 查询开始时间与结束时间在指定的日期范围之内&#xff0c;并且结束时间可以为NULL的数据...

C++OpenGL三维显示镜面反射光线漫反射实例

程序示例精选 COpenGL三维显示镜面反射光线漫反射实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《COpenGL三维显示镜面反射光线漫反射实例》编写代码&#xff0c;代码整洁&#xff0c;…...

【前端面试】从npm 升级到 pnpm的总结

pnpm优势 pnpm 和 npm 在性能上存在一些明显的差异,这也是一些开发者选择从 npm 切换到 pnpm 的原因。以下是一些关键的差异和原因: 1. 速度: pnpm 比 npm 快了近 2 倍,它通过优化的依赖管理,显著提高了安装速度 。 2. 磁盘空间效率: pnpm 使用基于内容寻址的文件系…...

深入浅出:从原理到实践,手把手教你理解并校准RV1126 ISP的黑电平(BLC)

深入浅出&#xff1a;从原理到实践&#xff0c;手把手教你理解并校准RV1126 ISP的黑电平(BLC) 在数字图像处理领域&#xff0c;黑电平校准&#xff08;Black Level Calibration, BLC&#xff09;是一个看似简单却至关重要的环节。想象一下&#xff0c;当你用专业相机拍摄星空时…...

Labelme标注实战:5分钟搞定语义分割数据集制作(附避坑指南)

Labelme标注实战&#xff1a;5分钟搞定语义分割数据集制作&#xff08;附避坑指南&#xff09; 当你第一次接触计算机视觉项目时&#xff0c;可能会被海量的标注需求吓到。别担心&#xff0c;今天我要分享的是如何用Labelme这个轻量级工具&#xff0c;快速完成语义分割数据标注…...

港科资讯|郑光廷教授出席国际科技组织发展与全球科技治理论坛 分享协作实践

2026年3 月 28 日&#xff0c;国际科技组织发展与全球科技治理论坛在北京中关村国际创新中心成功举办。香港科技大学副校长&#xff08;研究及发展&#xff09;郑光廷教授受邀出席并发表主题演讲&#xff0c;香港科大内地办(北京)主任袁冶老师一同参会&#xff0c;与中外嘉宾交…...

如何让Apple Touch Bar在Windows完美运行?DFRDisplayKm驱动全攻略

如何让Apple Touch Bar在Windows完美运行&#xff1f;DFRDisplayKm驱动全攻略 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm Apple Touch Bar作为MacBook Pro的特…...

原创分享:长图分割神器,让超长网页和聊天记录轻松打印

你是不是也遇到过这种情况&#xff1f; 1、想把微信里一段长长的聊天记录打印出来留存&#xff0c;结果发现截图太长&#xff0c;打印出来字小得看不清&#xff0c;或者直接被裁掉一大半 2、看到一篇很好的网页文章&#xff0c;想打印成纸质版慢慢看&#xff0c;但网页截图是一…...

服务器很卡,是CC攻击造成的吗

之前有客户反馈&#xff0c;服务器有一段时间使用总是会遇到卡的情况&#xff0c;查看并无流量攻击的情况&#xff0c;程序也未进行过什么修改&#xff0c;用户人数也没有什么变化。来咨询是什么原因导致的。导致机器卡的情况&#xff0c;一般有带宽不够&#xff0c;硬件性能不…...

等保三级Java安全改造全周期实录,从代码审计到渗透验证的12个生死关卡

第一章&#xff1a;等保三级Java安全改造的合规基线与生命周期全景图等保三级对Java应用提出了覆盖身份鉴别、访问控制、安全审计、通信保密性、代码安全及可信执行环境的全维度要求。其合规基线并非静态清单&#xff0c;而是贯穿需求分析、设计开发、测试验证、上线部署与持续…...

别只盯着时钟了!用Vivado的Set_Data_Check搞定FPGA里两个数据信号的时序检查(附工程源码)

FPGA时序约束进阶&#xff1a;用Set_Data_Check精准控制数据信号时序关系 在FPGA设计中&#xff0c;时序约束是确保电路功能正确性的关键环节。大多数工程师对时钟与数据信号之间的setup/hold约束已经驾轻就熟&#xff0c;但当面对两个数据信号之间的时序关系时&#xff0c;却常…...

使用Cosmos-Reason1-7B分析网络协议交互逻辑:以TCP三次握手为例

使用Cosmos-Reason1-7B分析网络协议交互逻辑&#xff1a;以TCP三次握手为例 最近在尝试用大模型来理解一些复杂的系统交互逻辑&#xff0c;发现了一个挺有意思的用法。我们团队在测试Cosmos-Reason1-7B时&#xff0c;没有让它写代码或者生成文案&#xff0c;而是给了它一个更“…...

R包版本冲突别头疼:手把手教你降级igraph 2.1.1,解决monocle3的orderCells报错

R包版本冲突实战指南&#xff1a;精准降级igraph解决monocle3依赖问题 当你满怀期待地安装好monocle3准备进行单细胞拟时序分析时&#xff0c;突然弹出的nei() was deprecated in igraph 2.1.0报错就像一盆冷水浇灭了热情。这种R包版本冲突在生物信息学分析中屡见不鲜&#xff…...