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

(栈)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 次# 思路

思路

首先,理解题目意思,有两个目的

  • 实现栈功能
  • 可以通过getMin获取到 栈 中的 最小值

辅助栈

在这里,这个最小值的获取,便使用栈去承载这个最小值,使用minStack表示
实际元素的存储的栈使用stack表示

栈先进后出,只要stack中有有元素出栈,则对应的这个最小值minstack栈,也要出栈,

其出栈后,minstack栈内的第一个元素,还是stack栈里面的最小值,示例如下

// 初始值 stack:null minStack:INT_MAX // -2入栈 stack:-2 minStack:INT_MAX,-2 // 0入栈 stack:-2,0 minStack:INT_MAX,-2,-2 // -3入栈 stack:-2,0,-3 minStack:INT_MAX,-2,-2,-3

Deque中用于栈操作(入栈、出栈、查看栈顶)的核心方法说明:

  • 入栈:push(E e):将元素压入栈顶(即添加到Deque的头部,遵循 LIFO 原则)
  • 出栈:pop():移除并返回栈顶元素(即Deque的头部元素,遵循 LIFO 原则)
  • 查看栈顶元素(不移除):peek():获取栈顶元素(即Deque的头部元素),但不移除该元素

单向链表

使用Node去存储这个过程,每个节点对应栈里的一个元素,同时携带了当前栈的最小值信息:

  • key:存入栈的元素本身的值,供top()方法返回栈顶元素
  • value:从栈底到当前节点为止,栈内的最小值,供getMin()方法直接返回
  • next:指向下一个节点(栈中更靠下、更早入栈的元素)

整个栈用单链表的头部作为栈顶

  • 入栈 = 链表头插法,新节点插在最前面
  • 出栈 = 链表头删法,直接把头指针后移一位
  • 所有操作都是 O (1) 时间
classNode{intkey;intvalue;Nodenext;publicNode(intkey,intvalue){this.key=key;this.value=value;this.next=null;};publicNode(intkey,intvalue,Nodenode){this.key=key;this.value=value;// 反向this.next=node;}}

注意:

  • 入栈时,更新的是当前这整个链表,即node=newNode,而非node.next=newNode
  • 出栈时,node=node.next;
// 初始值 in:null node:null // -2入栈 stack:-2 node:{-2,-2} // 0入栈 stack:-2,0 node:{0,-2},{-2,-2} // -3入栈 stack:-2,0,-3 node:{-3,-3},{0,-2},{-2,-2} // getMin() // pop() stack:-2,0 node:{0,-2},{-2,-2}

算法

辅助栈

classMinStack{Deque<Integer>stack;Deque<Integer>minStack;publicMinStack(){stack=newLinkedList<>();minStack=newLinkedList<>();minStack.push(Integer.MAX_VALUE);}publicvoidpush(intval){stack.push(val);minStack.push(Math.min(minStack.peek(),val));}publicvoidpop(){stack.pop();minStack.pop();}publicinttop(){returnstack.peek();}publicintgetMin(){returnminStack.peek();}}/** * Your MinStack object will be instantiated and called as such: * MinStack obj = new MinStack(); * obj.push(val); * obj.pop(); * int param_3 = obj.top(); * int param_4 = obj.getMin(); */

单向链表

classMinStack{Nodenode;publicMinStack(){}publicvoidpush(intval){if(node==null){node=newNode(val,val);}else{intmin=Math.min(node.value,val);NodenewNode=newNode(val,min,node);node=newNode;}}publicvoidpop(){node=node.next;}publicinttop(){returnnode.key;}publicintgetMin(){returnnode.value;}classNode{intkey;intvalue;Nodenext;publicNode(intkey,intvalue){this.key=key;this.value=value;this.next=null;};publicNode(intkey,intvalue,Nodenode){this.key=key;this.value=value;this.next=node;}}}/** * Your MinStack object will be instantiated and called as such: * MinStack obj = new MinStack(); * obj.push(val); * obj.pop(); * int param_3 = obj.top(); * int param_4 = obj.getMin(); */
http://www.jsqmd.com/news/1361649/

相关文章:

  • 动态规划解LeetCode摆动序列问题与优化
  • 13.Python3 类型注解
  • 5分钟掌握5大社交媒体数据采集:MediaCrawler终极解决方案
  • 2026年8月纯电动正三轮清扫车品牌推荐,哪个好? - 工业清洁测评社
  • 图片去水印用什么工具,免费、电脑手机在线方案一文讲透 - 耶斯去水印
  • 4.Python3 运算符
  • iOS激活锁绕过终极指南:使用applera1n解锁你的iPhone
  • 次短路删边法
  • 温州市文成县国内GEO服务商代理加盟靠谱推荐:源头厂商、区域保护与续约率怎么判断? - 科技快讯
  • LightRAG文档索引实战:从混合检索到向量化,构建高效RAG知识库
  • OfficeCLI:革命性AI办公自动化工具,一行命令掌控Word/Excel/PPT
  • 基于Agentic Workflow的智能邮件助手:从NLP解析到自动化执行的完整实践
  • 员工心理测评如何联动 360 度评估?4 类数据融合分析逻辑科普 - 衡识人才测评
  • 合肥市蜀山区国内GEO服务商代理加盟靠谱推荐:城市合伙人如何判断源头实力与合作价值? - 小随科技
  • Java面向对象编程三大特性解析与实践
  • 终极桌面伙伴养成指南:用DyberPet打造你的专属数字伙伴
  • AI Agent开发实战:从Claude Code集成到Railway部署的安全陷阱与防范
  • ChatGPT、Codex实战:修改代码总失败?从权限、目录、依赖到测试的8项排查
  • Mac NTFS读写终极解决方案:Free-NTFS-for-Mac完整使用指南
  • 揭秘AtlasOS:如何让Windows系统性能飙升26%的秘密武器
  • 2026电流传感器工厂推荐:聚焦高精度电流传感器制造与新能源工业应用 - 行业甄选智库
  • 温州市苍南县国内GEO服务商代理加盟靠谱推荐:苍南做GEO城市合伙人,为什么必须优先看源头厂商? - 小随科技
  • 如何去水印不破坏原图方法优缺点与AI无损工具现状 - 免费软件工具方法教程
  • hugo-theme-gallery核心功能解析:从私人相册到公开画廊的完整实现
  • 揭秘浏览器运行Linux的突破性技术:全面解析在线模拟器实战指南
  • 南京高精度电流传感器哪家好到底怎么选?谁更适合你的精密测量项目一文看懂 - 行业甄选智库
  • 如何让老旧Mac焕发新生:OpenCore Legacy Patcher完整实用指南
  • Prime Agent国际化:处理多语言项目的AI辅助技巧
  • 从零开始的openapi-backend mock服务:前端独立开发的福音
  • NumPy在AI大模型开发中的核心作用与优化技巧