【栈】Leetcode 155. 最小栈【中等】

news/2024/10/18 16:47:18/

最小栈

设计一个支持 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.

解题思路

  • 1、使用两个栈来实现:一个栈用于存储元素,另一个栈用于存储当前的最小元素。
  • 2、当元素被压入栈时,同时更新最小元素栈。
  • 3、当元素被弹出栈时,同时更新最小元素栈。

java_37">java实现

java">public class MinStack {private Stack<Integer> stack;private Stack<Integer> minStack;/** 初始化 */public MinStack() {stack = new Stack<>();minStack = new Stack<>();}public void push(int val) {stack.push(val);if (minStack.isEmpty() || val <= minStack.peek()) {minStack.push(val);}}public void pop() {if (!stack.isEmpty()) {int poppedValue = stack.pop();if (poppedValue == minStack.peek()) {minStack.pop();}}}public int top() {if (!stack.isEmpty()) {return stack.peek();}throw new RuntimeException("Stack is empty");}public int getMin() {if (!minStack.isEmpty()) {return minStack.peek();}throw new RuntimeException("Stack is empty");}public static void main(String[] args) {MinStack minStack = new MinStack();minStack.push(3);minStack.push(1);minStack.push(2);minStack.push(5);System.out.println("Top element: " + minStack.top());  // Output: 5System.out.println("Min element: " + minStack.getMin());  // Output: 1minStack.pop();System.out.println("Top element after pop: " + minStack.top());  // Output: 1System.out.println("Min element after pop: " + minStack.getMin());  // Output: 1}
}

时间空间复杂度

  • 时间复杂度:push、pop、top、getMin操作的时间复杂度均为O(1),因为栈的操作时间复杂度为O(1)。

  • 空间复杂度:push、pop、top、getMin操作的空间复杂度均为O(n),其中n为栈中元素的个数,因为需要额外的栈来存储最小元素。


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

相关文章

【devops】 阿里云挂载云盘 | 扩展系统硬盘 | 不重启服务器增加硬盘容量

扩容分区和文件系统&#xff08;Linux&#xff09; 文档地址 https://help.aliyun.com/zh/ecs/user-guide/extend-the-partitions-and-file-systems-of-disks-on-a-linux-instance?spm5176.smartservice_service_robot_chat_new.help.dexternal.4ac4f625Ol66kL#50541782adxmp…

XiaodiSec day029 Learn Note 小迪渗透学习笔记

XiaodiSec day029 Learn Note 小迪渗透学习笔记 记录得比较凌乱&#xff0c;不尽详细 day 29 知识点 明确查询方式注入 Payload 明确查询方式注入产生功能 明确 sql 盲注延时、布尔、报错 开始 如果查询数据没有在页面上回显&#xff0c;将不同于之前的注入情况 使用 uni…

使用 Cucumber框架进行BDD测试的一些项目

BehatMage 项目地址: https://github.com/MageTest/BehatMage 不过该项目在GitHub中有超过10年没有更新了。 项目介绍&#xff1a; BehatMage项目介绍 BehatMage是一个基于Behat的Magento测试框架&#xff0c;用于自动化测试Magento电子商务平台的功能和性能。Behat是一个行…

2024年五一杯数学建模A题B题C题思路汇总

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

Java 与垃圾回收有关的方法

1. gc 调用垃圾回收器的方法是 gc&#xff0c;该方法在 System 类和 Runtime 类中都存在。 在 Runtime 类中&#xff0c;方法 gc 是实例方法&#xff0c;方法 System.gc 是调用该方法的一种传统而便捷的方法。在 System 类中&#xff0c;方法 gc 是静态方法&#xff0c;该方法…

npm的配置文件及其路径问题

如何快捷修改.npmrc配置文件&#xff1f; .npmrc文件&#xff0c;就是npm的配置文件所在位置。 当然&#xff0c;寻找这个文件的目的&#xff0c;多数是为了修改.npmrc文件内容。 但npm提供了方便快捷的修改方式&#xff0c;不知道这个文件的位置&#xff0c;其实也是可以修改…

网络原理-IP协议

一、IP协议报头 版本号:用来表示IP协议的版本,现在常用的IP协议有两个版本,IPv4和IPv6&#xff0c;其他版本可能只存在于实验室中&#xff0c;并没有被广泛的使用。 首部长度:用来表示IP报头的长度,因为存在"选项"字段&#xff0c;所以IP报头是可变长的,此处单位为4…

Day45|动态规划part07:70. 爬楼梯 (进阶)、322. 零钱兑换、279. 完全平方数

爬楼梯&#xff08;进阶&#xff09; 之前已经做过这题了&#xff0c;实际上这题可以抽象成一个完全背包问题&#xff08;只有两种物品&#xff0c;一个1一个2&#xff0c;但是可以无限取&#xff09;&#xff0c;接下来用动规五部曲重新分析一下。 确定dp数组及其含义 dp[…