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

数据结构:单调栈

  • 单调的栈
    如果为单调递增的栈,在栈内有元素时,判断栈顶元素和要加入的元素的大小,如果要加入的元素小于栈顶元素,就先让栈顶元素出栈,直到要加入元素比栈顶元素大为止;

  • 解决什么问题?

  1. 当前元素左右侧,距离最近,并且比当前元素大的元素在哪里
  2. 当前元素左右侧, 距离最近,并且比当前元素小的元素在哪里
int a = [1, 4, 10, 6, 3, 3, 15, 21, 8]

例如,要解决获得每个元素 左侧的 最近的 比自己大 的数字的下标,从最左侧开始遍历:

  • 如果遍历到数a时,栈为空,则说明左侧没有比自己小的元素(或自己本身就是第一个元素),将结果数组填入零,并且自己的下标入栈;

  • 如果遍历到数a时,栈中的栈顶元素b比a小,由于a必然会在结束后进栈,并且a大于b,所以此时栈中的b不可能成为后续所有数的答案,可以放心的把b从栈中出栈,然后判断下一个栈顶元素和a的大小;

  • 如果栈顶元素大于a,则此时这个元素就是最靠近a的且大于a的数,将答案填入,并且将a入栈;

  • 实现方式:

  1. 严格单调
  2. 栈中存储下标
  • 寻找左侧比自己大的数:(顺序单调递减栈)
#include<iostream>
#include<stack>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int ret[N]; // 用来存放结果
int n;
void test()
{stack<int> st; //存放的是下标,为了直接便于往结果数组里面存for (int i = 1; i <= n; i++){while(st.size() && a[st.top()] <= a[i]) st.pop();  //严格单调递减栈if (st.size()) ret[i] = st.top();st.push(i);}for (int i = 1; i <= n; i++){cout << ret[i] << " ";}cout << endl;
}int main()
{cin >> n;for (int i =1; i <=n; i++){cin >> a[i];}test();return 0;
}
  • 寻找左侧比自己小的数
void test()
{stack<int> st; //存放的是下标,为了直接便于往结果数组里面存for (int i = 1; i <= n; i++){while(st.size() && a[st.top()] >= a[i]) st.pop();  //严格单调递减栈if (st.size()) ret[i] = st.top();st.push(i);}for (int i = 1; i <= n; i++){cout << ret[i] << " ";}cout << endl;
}
  • 寻找右侧...
修改遍历顺序即可
http://www.jsqmd.com/news/561477/

相关文章:

  • 3大突破!开源RGB控制终极指南:从多软件混战到统一灯光管理
  • C++17 filesystem实战:5分钟搞定跨平台文件操作(Windows/Linux示例)
  • 天鹅到家,月嫂/保姆/家政服务/母婴护理/养老护理,布局北京广州 - 十大品牌榜
  • Adobe Illustrator脚本终极指南:释放设计自动化的无限潜能
  • 人类的主观与事物发展的客观:一场注定的矛盾
  • SmolVLA多轮对话效果展示:复杂任务规划与上下文一致性测评
  • 终极Windows安装自由:MediaCreationTool.bat完整指南
  • 如何通过Claude HUD实时监控工具提升AI开发效率
  • 手把手教你恢复误删的xfce4面板(附备份还原完整流程)
  • Windows性能优化:任务管理器深度使用指南
  • 【技术笔记】Cheat Engine 内存搜索方法论:从入门到进阶
  • 从Fast Scan到Hierarchical:5种DFT测试架构选择指南(含SOC案例)
  • 2026最新月嫂推荐!北京/广州住家/白班等场景优质服务机构榜单 - 十大品牌榜
  • 2026最新北京/广州保姆推荐!住家/白班/钟点工/照顾老人/照顾孩子服务平台权威榜单 - 十大品牌榜
  • 云手机 流畅稳定 操作简单
  • 告别官方镜像!手把手教你将自编译Android系统刷入AVD(基于Android Studio 4.2+)
  • OpenClaw+GLM-4.7-Flash双剑合璧:3步实现科研论文自动化综述
  • 从“第一性原理”到“第二曲线”:如何用底层思维驱动业务创新
  • 安卓应用锁开发实战:如何用Activity拦截实现密码验证(附完整代码)
  • 转载整理:Agent 是怎么学会用 Skill 的?以OpenCode为例深入Skill底层机制
  • 【保姆级教程】zxing通过JNI编译成Java可调用的库
  • PvZ Toolkit:突破植物大战僵尸限制的终极修改器
  • 让黑苹果安装不再复杂:零基础用户的智能配置解决方案
  • 大模型推理中Prefill与Decode、KV Cache三者说明
  • 用按键控制LED太简单?试试FreeRTOS任务挂起与恢复的三种玩法(附STM32F407完整代码)
  • pnpm+turbo迅速搭建monorepo工程
  • BGP路由优化实战:加速收敛,提升网络稳定性
  • 致远A8+协同管理软件V8.0SP1:如何高效处理待办事项(附常见问题解答)
  • UE4蓝图插件推荐:这5款免费工具让你的开发效率翻倍(附详细使用技巧)
  • WaveTools多账号管理专家:一站式解决开发者多平台账户管理难题