【LeetCode】剑指 Offer 30. 包含min函数的栈 p165 -- Java Version
创始人
2025-05-31 07:41:00
0

题目链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/

1. 题目介绍(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.

【条件约束】:

提示:

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

【相关题目】:

注意:本题与主站 155. 最小栈 题目相同。

2. 题解

2.1 辅助栈(原书题解)-- O(1)

时间复杂度O(1),空间复杂度O(2n)
在这里插入图片描述

解题思路
题目要求定义一个栈的数据结构,并使得 minpushpop 的时间复杂度都是 O(1),由于栈是一种后进先出的数据结构,所以要想保证min的时间复杂度为O(1),就必须让最小值始终位于栈顶元素

实现策略
因为涉及到数据元素的进出栈问题,我们不能通过简单的在栈中定义一个成员变量的方式来记录最小值,因为当最小值一旦出栈,你就很难再去以O(1)的时间复杂度去找到次小值。所以正确的策略,应该是通过一个辅助栈,在正常的数据栈normal元素压栈时,记录最小值的数据栈min对当前压栈值进行判断,将更小值压入栈内;出栈时,两栈同时弹出,这样就能保证当前栈中的最小值始终处于min的栈顶位置,保证了min方法的O(1)复杂度。

class MinStack {Stack normal;Stack min;/** initialize your data structure here. */public MinStack() {normal = new Stack<>();min = new Stack<>();}public void push(int x) {normal.push(x);if (min.size() == 0 || x < min.peek()) min.push(x);else min.push(min.peek());}public void pop() {normal.pop();min.pop();}public int top() {return normal.peek();}public int min() {return min.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.min();*/

在这里插入图片描述

简化实现

思路与上面相同,仅部分判断有所简化

class MinStack {Stack A, B;public MinStack() {A = new Stack<>();B = new Stack<>();}public void push(int x) {A.add(x);if(B.empty() || B.peek() >= x)B.add(x);}public void pop() {if(A.pop().equals(B.peek()))B.pop();}public int top() {return A.peek();}public int min() {return B.peek();}
}

在这里插入图片描述

3. 参考资料

[1] 面试题30. 包含 min 函数的栈(辅助栈,清晰图解)-- 图片与简化题解来源

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...