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

LeetCode 最大栈题解

LeetCode 最大栈题解

题目描述

设计一个支持pushpoptoppeekMaxpopMax操作的栈。

示例

输入:

["MaxStack","push","push","push","top","popMax","top","peekMax","pop","top"] [[],[5],[1],[5],[],[],[],[],[],[]]

输出:[null,null,null,null,5,5,1,5,1,5]

解题思路

方法:双栈

思路

  • 使用两个栈来实现最大栈:一个主栈(stack)用于存储所有元素,一个辅助栈(max_stack)用于存储最大值。
  • 当调用 push 操作时,将元素压入主栈,如果辅助栈为空或当前元素大于等于辅助栈的栈顶元素,将当前元素压入辅助栈,否则将辅助栈的栈顶元素再次压入辅助栈。
  • 当调用 pop 操作时,同时弹出主栈和辅助栈的栈顶元素。
  • 当调用 top 操作时,返回主栈的栈顶元素。
  • 当调用 peekMax 操作时,返回辅助栈的栈顶元素。
  • 当调用 popMax 操作时,需要特殊处理:弹出辅助栈的栈顶元素,然后使用一个临时栈来保存主栈中弹出的元素,直到找到与辅助栈栈顶元素相等的元素,弹出该元素,然后将临时栈中的元素重新压入主栈和辅助栈。

复杂度分析

  • 时间复杂度:push、pop、top、peekMax 操作的时间复杂度是 O(1),popMax 操作的时间复杂度是 O(n)。
  • 空间复杂度:O(n),需要额外的空间来存储元素。

代码实现

方法:双栈

# 最大栈(双栈) class MaxStack: def __init__(self): self.stack = [] self.max_stack = [] def push(self, x): self.stack.append(x) # 如果辅助栈为空或当前元素大于等于辅助栈的栈顶元素,压入当前元素 if not self.max_stack or x >= self.max_stack[-1]: self.max_stack.append(x) else: # 否则将辅助栈的栈顶元素再次压入辅助栈 self.max_stack.append(self.max_stack[-1]) def pop(self): if self.stack: self.max_stack.pop() return self.stack.pop() def top(self): if self.stack: return self.stack[-1] def peek_max(self): if self.max_stack: return self.max_stack[-1] def pop_max(self): if not self.stack: return None max_val = self.max_stack[-1] temp = [] # 将主栈中大于 max_val 的元素弹出并保存到临时栈 while self.stack and self.stack[-1] != max_val: temp.append(self.stack.pop()) self.max_stack.pop() # 弹出 max_val self.stack.pop() self.max_stack.pop() # 将临时栈中的元素重新压入主栈和辅助栈 while temp: val = temp.pop() self.stack.append(val) if not self.max_stack or val >= self.max_stack[-1]: self.max_stack.append(val) else: self.max_stack.append(self.max_stack[-1]) return max_val # 测试 def test_max_stack(): obj = MaxStack() obj.push(5) obj.push(1) obj.push(5) print(obj.top()) # 输出:5 print(obj.pop_max()) # 输出:5 print(obj.top()) # 输出:1 print(obj.peek_max()) # 输出:5 print(obj.pop()) # 输出:1 print(obj.top()) # 输出:5 if __name__ == "__main__": test_max_stack()

测试用例

测试用例 1:基本情况

输入:

["MaxStack","push","push","push","top","popMax","top","peekMax","pop","top"] [[],[5],[1],[5],[],[],[],[],[],[]]

输出:[null,null,null,null,5,5,1,5,1,5]

总结

最大栈是一个经典的栈问题,它可以通过双栈来高效地解决。

双栈法的核心思想是:使用一个主栈存储所有元素,一个辅助栈存储最大值,确保在常数时间内可以获取到最大值。

掌握双栈法,对于解决类似的问题非常重要。

http://www.jsqmd.com/news/767032/

相关文章:

  • 2026年拉萨砂浆采购指南:如何甄选靠谱的本土优质厂家? - 2026年企业推荐榜
  • 基于完美信息蒸馏的斗地主AI技术突破:PerfectDou架构设计与实战部署
  • 5分钟快速解锁Windows远程桌面限制:RDP Wrapper完全指南
  • LLAMA 配置AI大模型参数 --temp、--top-p、--top-k
  • 基于GitHub Actions自动化构建团队技能矩阵:从原理到实战部署
  • 从混乱到专业:5分钟用LaTeX的booktabs和multirow打造期刊级三线表与复杂表格
  • 轻量级进程守护工具 openclaw-keep-alive 实战指南
  • 2026年番禺铭悦玉府全屋定制专业服务商如何选型指南
  • 从VGG、ResNet到DenseNet:在FER2013上跑个分,聊聊我为什么最终选了它
  • 【Docker 27低代码容器化实战手册】:27个生产级部署技巧,零基础3天上线首个低代码应用
  • 【Docker监控黄金法则】:20年运维专家亲授7大必监指标与实时告警配置实战
  • 动态容量MoE框架实现语音与音乐统一生成
  • 如何快速连接魔兽世界自定义服务器:Arctium启动器完全指南
  • 毕业季不熬夜:用百考通AI轻松搞定本科毕业论文
  • 仅花几十元用一年|2026 实测智在记录 AI 会议纪要,每月省 20 + 小时,年省上千块
  • 从‘拖拉机油门’到平稳控制:在Python/Matlab里仿真PID积分饱和与抗饱和设计
  • TInyML基础:“不用死记公式!一文讲透全连接层:它到底把神经网络‘连’成了什么样?”
  • 农业物联网插件安全审计必做清单,VSCode 2026新增SAST扫描模块深度解析(仅限前500名下载CVE-2026-Agri补丁)
  • LeetCode 基本计算器题解
  • 如何实现Cursor Pro永久免费使用:完整技术指南
  • 凿岩机械臂力传感与运动控制轨迹规划【附代码】
  • MCP协议:构建AI智能体与外部工具的安全标准化桥梁
  • 缠论可视化终极指南:如何在通达信中快速部署免费分析插件
  • 2026年免费查论文AI率3个正规渠道,附降到15%以下完整教程
  • 视觉语言模型鲁棒性提升:ArtiAgent伪影生成技术解析
  • 如何高效使用PE-bear进行PE文件逆向分析:实用指南
  • 第31集:大模型容错架构!当 LLM 超时/幻觉/被限流时的降级与兜底方案
  • 网盘直链下载终极解决方案:全平台免费高速下载的完整指南
  • 无人热干面餐厅服务机器人抓取策略深度学习【附代码】
  • 5分钟搭建你的私人云游戏服务器:Sunshine游戏串流终极指南