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

从零开始写算法-栈-最小值(记忆化pair)

一、题目简介

题目描述
设计一个支持以下操作的栈:

  • push(x) —— 将元素 x 推入栈中

  • pop() —— 删除栈顶的元素

  • top() —— 获取栈顶元素

  • getMin() —— 检索栈中的最小元素

要求:
每个操作的时间复杂度必须是 O(1)

二、思路分析

这道题的核心在于:
我们在每次 push 的时候,除了记录栈顶的值,还要顺便记录当前栈内的最小值

换句话说,我们可以让每一层栈都携带两个信息:

 

pair<当前元素, 当前最小值>

这样一来,每次入栈或出栈时,我们都可以在 O(1) 时间内拿到最小值。


⚙️ 三、关键设计

1. 栈的结构设计

我们用一个栈 stack<pair<int, int>> 来存放数据:

  • first 表示栈顶元素的值;

  • second 表示当前栈的最小值。

例如:

[(2, 2), (5, 2), (1, 1)]

此时:

  • 栈顶 first=1

  • 栈顶 second=1

  • 当前最小值为 1。


2. 初始状态设计

我们在构造函数中手动压入一个初始值:

st.push(pair(0, INT_MAX));

为什么要这么做?

  • 因为这样可以确保第一个入栈的元素一定比 INT_MAX 小;

  • 避免在第一次 pushst.top() 为空导致出错。


3.入栈逻辑

每当我们 push(val) 时:

  • 当前最小值应为:

    min(val, st.top().second)

    即「当前值」与「之前的最小值」中取较小的一个;

  • 再用 pair{val, 当前最小值} 压栈。


4️⃣ 出栈逻辑

直接 st.pop() 即可,当前最小值自动回退为下一个元素的 second


5️⃣ top() 与 getMin()

因为 st.top() 返回的是一个 pair<int, int>

  • st.top().first → 栈顶元素;

  • st.top().second → 当前最小值。

四、完整代码

class MinStack {// 思路: 维护栈顶的最小元素 pair<栈顶元素, 最小值>stack<pair<int, int>> st;public:MinStack() {// 初始时推入一个虚拟节点,避免空栈判断st.push(pair(0, INT_MAX));}void push(int val) {st.push(pair{val, min(val, st.top().second)});}void pop() {st.pop();}int top() {return st.top().first;}int getMin() {return st.top().second;}
};

五、运行逻辑示例

push(2), push(5), push(1) 为例:

操作栈内容 (pair<值, 当前最小值>)
初始[(0, INF)]
push(2)[(0, INF), (2, 2)]
push(5)[(0, INF), (2, 2), (5, 2)]
push(1)[(0, INF), (2, 2), (5, 2), (1, 1)]

此时:

  • top() → 1

  • getMin() → 1

  • pop() 后最小值回退为 2


六、知识要点总结

知识点说明
pair<int,int>同时存两个相关的变量
.first / .second分别取出 pair 中的两个值
st.top()返回栈顶元素(是 pair)
INT_MAX初始化为无穷大,方便比较
min(a, b)返回较小值

七、总结

使用 pair 维护最小值 的思路非常高效:

  • 不需要额外的数据结构;

  • 所有操作都是 O(1);

  • 逻辑简洁、实现优雅。

这类“带记忆功能”的栈思想非常常见,
比如 “含最大值的栈”、“含和的栈” 都能用相同的套路解决。

http://www.dtcms.com/a/581516.html

相关文章:

  • 网站建设市场介绍电子商务网址
  • Sora:视频生成的突破与启示
  • Flutter:视频预览功能
  • IPIDEA海外代理助力-Youtube视频AI领域选题数据获取实践
  • 开机视频动画
  • 智能守护校园:视频汇聚平台EasyCVR如何构建校园消防安全新防线
  • 平台类网站建设企业网站个人备案
  • python+django/flask的车辆尾气检测排放系统-可视化大屏展示
  • AI Agent设计模式 Day 2:Plan-and-Execute模式:先规划后执行的智能策略
  • 32HAL——ADC模数转换多通道功能
  • 10_10_网站建站主页网站怎么建设
  • 模型不再是一整块!Hunyuan3D-Part 实现可控组件式 3D 生成
  • 【ZeroRange WebRTC】SDP 在 WebRTC 中的角色与工作原理(深入指南)
  • 高并发下的重复记录之谜:从前端到数据库的全方位排查
  • AI搜索时代品牌护城河:从“流量争夺”到“可信度竞争”的战略跃迁
  • 【推荐系统14】数据分析:以阿里天池新闻推荐为例学习
  • 安卓进阶——OpenGL ES
  • 做app动态界面的网站有哪些网站建设从哪入手
  • RV1126 NO.41:利用OPENCV的API计算轮廓面积
  • 15 langgraph基本组件
  • 网站开发答辩ppt上海网站排名
  • LeetCode 面试经典 150_二叉树_翻转二叉树(69_226_C++_简单)(DFS)
  • 【PLM实施专家宝典】离散制造企业ECO管理优化方案:构建自动化、零错误的变更引擎
  • go tool command
  • 网站流量如何做cms网站开发流程
  • HTML ASCII 编码解析与应用
  • Javascript函数之函数的参数以及默认参数?
  • LNMP部署及应用
  • 优质做网站哪家正规wordpress附件修复
  • Java-HTTP响应以及HTTPS(下)