单调栈详解

文章目录

  • 单调栈详解
    • 一、引言
    • 二、单调栈的基本原理
      • 1、单调栈的定义
      • 2、单调栈的维护
    • 三、单调栈的应用场景
    • 四、使用示例
      • 1、求解下一个更大元素
      • 2、计算柱状图中的最大矩形面积
    • 五、总结

单调栈详解

在这里插入图片描述

一、引言

单调栈是一种特殊的栈结构,它在栈的基础上增加了单调性约束,即栈内的元素必须保持单调递增或单调递减的顺序。这种数据结构在解决某些特定问题时非常高效,例如求解下一个更大/更小元素、计算柱状图中的最大矩形面积等。本文将详细介绍单调栈的原理、实现以及应用场景。

二、单调栈的基本原理

1、单调栈的定义

单调栈是一种特殊的栈,栈内的元素必须保持单调递增或单调递减的顺序。根据栈的单调性,单调栈可以分为单调递增栈单调递减栈

  • 单调递增栈:从栈底到栈顶,元素单调递增。
  • 单调递减栈:从栈底到栈顶,元素单调递减。

2、单调栈的维护

单调栈的核心在于维护其单调性。当新元素入栈时,需要根据栈的单调性决定是否弹出栈顶元素。例如:

  • 对于单调递增栈,如果新元素大于栈顶元素,则直接入栈;否则,弹出栈顶元素,直到满足单调性。
  • 对于单调递减栈,逻辑相反。

三、单调栈的应用场景

单调栈主要用于解决以下两类问题:

  1. 求解下一个更大/更小元素:通过单调栈,可以在一次遍历中找到每个元素的下一个更大或更小元素。
  2. 计算柱状图中的最大矩形面积:利用单调栈可以高效地找到每个柱子的左右边界,从而计算最大矩形面积。

四、使用示例

1、求解下一个更大元素

以下是使用单调栈求解数组中每个元素的下一个更大元素的代码示例:

java复制

public int[] nextGreaterElement(int[] nums) {int[] result = new int[nums.length];Arrays.fill(result, -1); // 初始化结果数组Deque<Integer> stack = new ArrayDeque<>(); // 使用单调栈for (int i = 0; i < nums.length; i++) {// 如果栈不为空且当前元素大于栈顶元素while (!stack.isEmpty() && nums[i] > nums[stack.peek()]) {int index = stack.pop(); // 弹出栈顶元素result[index] = nums[i]; // 更新结果数组}stack.push(i); // 当前索引入栈}return result;
}

2、计算柱状图中的最大矩形面积

以下是使用单调栈计算柱状图中最大矩形面积的代码示例:

java复制

public int largestRectangleArea(int[] heights) {int maxArea = 0;Deque<Integer> stack = new LinkedList<>();for (int i = 0; i <= heights.length; i++) {int height = (i == heights.length) ? 0 : heights[i];while (!stack.isEmpty() && height < heights[stack.peek()]) {int h = heights[stack.pop()];int w = stack.isEmpty() ? i : i - stack.peek() - 1;maxArea = Math.max(maxArea, h * w);}stack.push(i);}return maxArea;
}

五、总结

单调栈是一种高效的数据结构,适用于解决特定的算法问题。通过维护栈的单调性,单调栈可以在一次遍历中完成复杂的计算,时间复杂度为O(n)。然而,单调栈的适用范围有限,仅适用于特定类型的问题。在实际应用中,我们需要根据问题的特点选择合适的数据结构和算法。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • 深入理解单调栈算法,这一篇就够了 - CSDN博客
  • 《代码随想录》单调栈:高性能Java实现与详细图解 - CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6356.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法题之栈与队列:理论基础与常用操作接口

栈与队列 &#xff08;1&#xff09;理论基础 栈&#xff1a;先进后出的数据结构 队列&#xff1a;先进先出的数据结构 栈提供push 和 pop 等等接口&#xff0c;所有元素必须符合先进后出规则&#xff0c;所以栈不提供走访功能&#xff0c;也不提供迭代器(iterator)。 不像是…

snippets router pinia axios mock

文章目录 补充VS Code 代码片段注册自定义组件vue routerpinia删除vite创建项目时默认的文件axiosmock3.0.x版本的 viteMockServe 补充 为文章做补充&#xff1a;https://blog.csdn.net/yavlgloss/article/details/140063387 VS Code 代码片段 为当前项目创建 Snippets {&quo…

llama-2-7b权重文件转hf格式及模型使用

目录 1. obtain llama weights 2. convert llama weights files into hf format 3. use llama2 to generate text 1. obtain llama weights &#xff08;1&#xff09;登录huggingface官网&#xff0c;搜索llama-2-7b &#xff08;2&#xff09;填写申请表单&#xff0c;VP…

图形化数据报文转换映射工具

目录 概要整体架构流程技术名词解释技术细节小结 概要 在当今数字化时代&#xff0c;数据的处理和分析是企业、科研机构以及各类组织日常运营的核心环节。数据来源广泛&#xff0c;格式多样&#xff0c;常见的数据格式包括XML&#xff08;可扩展标记语言&#xff09;和JSON&a…

计算机视觉算法实战——无人机检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​ 1. 引言✨✨ 随着无人机技术的快速发展&#xff0c;无人机在农业、物流、监控等领域的应用越来越广泛。然而&#xff0c;无人机的滥用也带…

我谈概率论与数理统计的知识体系

学习概率统计二十多年后&#xff0c;在廖老师的指导下&#xff0c;厘清了各章之间的关系。本来就是一条线两个分支&#xff0c;脉络很清晰。 分支一&#xff1a;从随机现象到样本空间到随机事件再到概率。 从随机事件到随机变量&#xff1a;为了进行定量的数学处理&#xff0…

docker ubuntu:20.04构建c++ grpc环境

由c grpc必须源码编译&#xff0c;ubuntu版本不同可能出现的问题也不同&#xff0c;这里分享下我的构建过程。 我是vscode结合docker去安装c虚拟环境&#xff0c;我不想污染本机环境。 vscode的插件Dev Containers Dockerfile如下(如果单纯是ubuntu环境构建&#xff0c;可忽略该…

使用KNN实现对鸢尾花数据集或者自定义数据集的的预测

创建自定义数据集&#xff1a; point1[[7.7,6.1],[3.1,5.9],[8.6,8.8],[9.5,7.3],[3.9,7.4],[5.0,5.3],[1.0,7.3]] point2[[0.2,2.2],[4.5,4.1],[0.5,1.1],[2.7,3.0],[4.7,0.2],[2.9,3.3],[7.3,7.9]] point3[[9.2,0.7],[9.2,2.1],[7.3,4.5],[8.9,2.9],[9.5,3.7],[7.7,3.7],[9.…

Go学习:常量

变量&#xff1a;程序运行期间&#xff0c;可以改变的量&#xff0c;变量声明需要使用 var 常量&#xff1a;程序运行期间&#xff0c;不可以改变的量&#xff0c;常量声明需要使用 const 目录 1. 常量不允许修改 2. 常量赋值不使用 : 3. 常量能够自动推导类型 1. 常量不允许…

钉钉群机器人设置——python版本

钉钉群机器人设置——python版本 应用场景钉钉界面操作程序开发效果展示 应用场景 由于工作需要&#xff0c;很多项目执行程序后出现报错信息无法第一时间收到&#xff0c;因此实时预警对于监控程序还是有必要。&#xff08;仅个人观点&#xff09; 参考文档及博客&#xff1a…

Effective Python系列(1.1):区别bytes和str

本篇文章是 Effective Python 这本书的第一章&#xff0c;本章的主要内容是什么样的代码风格才是比较符合 Python 语言。 在 Python 当中&#xff0c;bytes 和 str 是两种不同的数据结构。使用时&#xff0c;需要注意两者区别&#xff1a; bytes 包含的是由 8 位值所组成的序列…

vue + element-ui 组件样式缺失导致没有效果

失效 代码&#xff1a; 修改方法&#xff1a; 在main.js文件里面加上&#xff1a; import element-ui/lib/theme-chalk/index.css; 最后&#xff1a;

Formality:不可读(unread)的概念

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中有时会遇到不可读(unread)这个概念&#xff0c;本文就将对此…

机器学习 vs 深度学习

目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练&#xff08;归纳&#xff09;和预测&#xff08;演绎&#xff09; 归纳: 从具体案例中抽象一般规律…

OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯

目录 简述 什么是高通滤波&#xff1f; 高通滤波的概念 应用场景 索贝尔算子 算子公式 实现代码 特点 沙尔算子 算子公式 实现代码 特点 拉普拉斯算子 算子公式 实现代码 特点 高通滤波器的对比与应用场景 相关阅读 OpenCV&#xff1a;图像滤波、卷积与卷积核…

豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | &#x1f40d; 蛇年运势预测 在线体验地址&#xff1a;蛇年…

开源鸿蒙开发者社区记录

lava鸿蒙社区可提问 Laval社区 开源鸿蒙项目 OpenHarmony 开源鸿蒙开发者论坛 OpenHarmony 开源鸿蒙开发者论坛

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN &#xff0c;以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

简洁实用的wordpress外贸模板

简洁、实用、大气的wordpress外贸模板&#xff0c;适合跨境电商搭建外贸B2B产品展示型网站。 简洁实用的wordpress外贸模板 - 简站WordPress主题简洁、实用、大气的wordpress外贸模板&#xff0c;适合跨境电商搭建外贸B2B产品展示型网站。https://www.jianzhanpress.com/?p828…

编程界“华山论剑”:PHP与Go,谁主沉浮?

在编程的广阔天地里&#xff0c;选择一门合适的编程语言就如同为一场冒险挑选趁手的武器&#xff0c;至关重要却又常常令人纠结。当我们面对 PHP 与 Go 这两种备受瞩目的编程语言时&#xff0c;这种纠结愈发明显&#xff1a;PHP&#xff0c;作为 Web 开发领域的老牌劲旅&#x…