我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么找出栈中的最小值

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么找出栈中的最小值

本篇内容主要讲解“怎么找出栈中的最小值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么找出栈中的最小值”吧!

题目

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.  LeetCode 地址:leetcode-cn.com/problems/ba…

思考

首先来说这道题目本身很好理解,它的实现难点在于以下两个方面:

  • 当我们进行 pop(移除栈顶元素)操作时如果删除的是当前最小值,那么我们如何寻找下一个最小值?

  • 要保证调用 min、push 及 pop 的时间复杂度都是 O(1)。

也就是说,在我们执行了 pop 时如果移除的栈中最小的值,那么如何寻找栈中的下一个最小元素?并且要保证操作的时间复杂度为  O(1)。这个时间复杂度制约了我们在移除了最小值之后不能通过遍历查找下一个最小值,所以这就成为了这道题的难点。

比如当我们移除以下栈顶元素值:

怎么找出栈中的最小值

因为最小值就是 1,因此在移除之后最小值也被移除了,如下图所示:

怎么找出栈中的最小值

那么接下来,让我们一起思考 3 分钟,想一想应该如何处理这个问题~

解题思路

其实我们可以在每次入栈时,判断当前元素是否小于最小值,如果小于则将原最小值和最新的最小值相继入栈,这样在调用 pop  时即使移除的是最小值,我们也能通过获取下一个元素得到一个新的最小值,执行流程如下所示。

操作步骤1

入栈第一个元素,因为是第一个元素,因此最小值就是此元素的值。

怎么找出栈中的最小值

操作步骤2

入栈第二个元素,如下图所示:

怎么找出栈中的最小值

因为入栈的元素 3 比 8 小,所以先将栈中的原最小值 8 存入栈中,再将 3 入栈。

操作步骤3

入栈第三个元素,如下图所示:

怎么找出栈中的最小值

因为入栈元素 5 大于 3,因此栈中的最小值不变,直接将元素 5 入栈。

操作步骤4

继续入栈,如下图所示:

怎么找出栈中的最小值

入栈元素 1 小于 3,因此先将原最小值 3 入栈,再将 1 入栈,栈中的最小值更改为 1。

操作步骤5

执行出栈操作,如下图所示: [图片上传中...(image-f68dcf-1602769401330-6)]

元素 1 出栈,判断当前元素就是栈的最小值,因此将栈顶元素 3 设置为最小值,并移除元素 3,如下图所示:

怎么找出栈中的最小值

操作步骤6

继续出栈,如下图所示:

怎么找出栈中的最小值

因为元素 5 不是当前最小值,因此直接出栈。

操作步骤7

继续出栈,如下图所示:

怎么找出栈中的最小值

因为出栈元素 3 为最小值,因此继续将最小值设置为栈顶元素 8,并将栈顶元素出栈,如下图所示:

怎么找出栈中的最小值

这样就剩下最后一个元素了,最后一个元素出栈之后就成空栈了,整个流程就执行完了。

实现代码1

接下来我们将上面的思路用代码实现一下,我们用数组实现的栈来实现相关的功能,代码如下:

class MinStack {     private int[] data; // 栈数据     private int maxSize; // 最大长度     private int top; // 栈顶指针(下标)     private int min; // 最小值      // 构造函数     public MinStack() {         // 设置默认值         maxSize = 10000;         data = new int[maxSize];         top = -1;         min = Integer.MAX_VALUE;     }      // 入栈(添加元素)     public void push(int x) {         if (min >= x) {             // 遇到了更小的值,记录原最小值(入栈)             data[++top] = min;             min = x;         }         // 当前值入栈         data[++top] = x;     }      // 出栈(移除栈顶元素)     public void pop() {         if (min == data[top]) {             min = data[--top]; // 拿到原最小值,并(将原最小值)出栈         }         --top; // 出栈     }      // 查找栈顶元素     public int top() {         return data[top];     }      // 查询最小值     public int min() {         return min;     } }

上述代码在 LeetCode 的执行结果如下:

怎么找出栈中的最小值

可以看出性能还是很高的,超越了 99.92% 的用户,内存消耗也不大。它的核心代码在 push 方法内,先将原最小值和最新最小值相继入栈,在 pop  出栈时判断出栈元素是否为最小值,如果是最小值则将当前最小值指向栈顶元素并将栈顶元素出栈,这样就得到了下一个新的最小值了。

实现代码2

如果我们不想使用数组的自定义栈来实现,还可以使用 Java 中自带的栈 Stack 来实现此功能,代码如下:

class MinStack {     private Stack<Integer> stack = new Stack<>();     private int min = Integer.MAX_VALUE;      public MinStack() { }      // 入栈(添加元素)     public void push(int x) {         if (x <= min) {             // 遇到了更小的值,记录原最小值(入栈)             stack.push(min);             min = x;         }         stack.push(x);     }      // 出栈(移除栈顶元素)     public void pop() {         if (stack.pop() == min) {             min = stack.pop(); // 取出原最小值         }     }      // 查找栈顶元素     public int top() {         return stack.peek();     }      // 查询最小值     public int min() {         return min;     } }

上述代码在 LeetCode 的执行结果如下:

怎么找出栈中的最小值

从结果可以看出,使用 Java 中自带的栈的性能不如自定义数组的栈,但代码还是通过了测试。这种实现方式的优点就是代码比较简单,可以利用了 Java 自身的  API 来完成了最小值的查找。

这种实现代码的方式(使用 Java API),在刷题或者实际面试中如果没有特殊说明是可以直接用的。

到此,相信大家对“怎么找出栈中的最小值”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么找出栈中的最小值

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python怎么找出list最大值最小值

可以使用内置的max()和min()函数来找出列表的最大值和最小值。例如,假设有一个列表nums:nums = [5, 2, 9, 1, 7]要找到最大值,可以使用max()函数:max_value = max(nums)print
python怎么找出list最大值最小值
2024-02-29

python怎么找出列表最大值和最小值

Python中可以使用内置函数max()和min()来找出列表的最大值和最小值。示例代码如下:my_list = [4, 2, 8, 5, 3]# 找出列表的最大值max_value = max(my_list)print("最大值
python怎么找出列表最大值和最小值
2024-02-29

JavaScript如何找出数组的最大值和最小值

这篇文章将为大家详细讲解有关JavaScript如何找出数组的最大值和最小值,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。找出数组的最大值和最小值可以使用for循环遍历数组的每个值,从而找到最大值或最小值
2023-06-27

vb怎么找出数组中的最大值

要找出数组中的最大值,可以使用循环遍历数组,比较每个元素的大小,记录下最大的值。可以使用以下代码来实现:```vbDim array() As Integer = {1, 2, 3, 4, 5}Dim max As Integer = ar
2023-10-12

MySQL怎么查找某列的最大值和最小值

要查找某列的最大值和最小值,可以使用以下查询语句:SELECT MAX(column_name) AS max_value, MIN(column_name) AS min_value FROM table_name;在这个查询语句中,将
MySQL怎么查找某列的最大值和最小值
2024-03-06

php怎么输出数组的最大值和最小值

要输出数组的最大值和最小值,可以使用PHP内置的max()和min()函数。示例代码如下:```php$arr = [1, 2, 3, 4, 5];$maxValue = max($arr);$minValue = min($arr);ec
2023-10-10

php中怎么找出数组中重复率最高的值

php中怎么找出数组中重复率最高的值,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们来看看下面一个例子。
2023-06-20

sql怎么查找符合条件的最小值

要查找符合条件的最小值,可以使用以下 SQL 查询语句:SELECT MIN(column_name) FROM table_name WHERE condition;在这个查询语句中,MIN(column_name) 用于获取符合条
sql怎么查找符合条件的最小值
2024-04-09

c语言怎么找出十个数的最大值

可以定义一个变量来保存最大值,然后遍历这十个数,比较每个数和当前最大值,如果当前数大于最大值,则更新最大值。下面是一个示例代码:```#include int main() {int nums[10]; // 存放十个数的数组int i,
2023-08-09

Java查找 List 中的最大最小值实例演示

以下实例演示了如何使用 Collections 类的 max() 和 min() 方法来获取List中最大最小值:import java.util.*;public
2023-05-31

js如何查找json数据中的最大值和最小值方法

这篇文章主要介绍了js如何查找json数据中的最大值和最小值方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-16

python如何找出列表中最小的元素

可以使用min()函数来找出列表中的最小元素。min()函数接受一个可迭代对象作为参数,然后返回其中的最小值。以下是一个示例代码:```pythonmy_list = [5, 3, 8, 1, 2]min_element = min(my_
2023-09-05

C++中怎么利用LeetCode寻找旋转有序数组的最小值

这篇文章将为大家详细讲解有关C++中怎么利用LeetCode寻找旋转有序数组的最小值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。[LeetCode] 154. Find Minimum i
2023-06-20

php怎么求数组最大值和最小值的差值

求差值的步骤:1、使用max()函数获取数组最大值,语法“max($arr)”;2、使用min()函数获取数组最小值,语法“min($arr)”;3、使用“-”运算符将获取的最大值和最小值相减计算差值即可,语法“最大值 - 最小值”。本教程操作环境:windows7系统、PHP8.1版、DELL G3电脑php求数组最大值和最小值的差值的方法在PHP中,可以利用max()和min()函数求数组最大值
2022-07-07

r语言怎么获取数组中的最大值和最小值

在R语言中,可以使用max()函数和min()函数来获取数组中的最大值和最小值。例如,假设有一个包含一组数字的数组x,要获取该数组中的最大值和最小值,可以使用以下代码:x <- c(1, 2, 3, 4, 5)max_value <-
r语言怎么获取数组中的最大值和最小值
2024-03-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录