单调栈【2023年最新】

news2024/11/28 0:31:09

做题的时候看到了单调栈,但是不知道是个什么玩意,记录一下吧。

单调栈含义

单调栈是一种特殊的数据结构,用于解决一些与单调性相关的问题。它的基本含义是在栈的基础上,维护一个单调递增或单调递减的栈。

在单调递增栈中,栈内元素从栈底到栈顶是递增有序的,而在单调递减栈中,栈内元素从栈底到栈顶是递减有序的。

单调栈的基本使用是通过维护栈内元素的单调性,来解决一些与单调性相关的问题。常见的应用场景包括:

  1. 下一个更大元素:给定一个数组,对于每个元素,找到它右边第一个比它大的元素。
  2. 下一个更小元素:给定一个数组,对于每个元素,找到它右边第一个比它小的元素。
  3. 最大矩形面积:给定一个二维矩阵,求其中全为1的最大矩形的面积。

使用单调栈解决这些问题的基本思路是,遍历数组或矩阵中的元素,将元素依次入栈,并在入栈时维护栈内元素的单调性。当遇到一个元素破坏了栈内元素的单调性时,可以根据问题的要求进行相应的处理,然后将该元素入栈。

通过这种方式,可以在O(n)的时间复杂度内解决一些与单调性相关的问题,其中n是数组或矩阵的大小。

看到个题目,昨天,想自己用单调栈做出来,但是没做出来,上网看了下有一些解法,但是都存在问题?然后叫ChatGPT写了一个,感觉能用,也测试了一下,确实可以,但是为什么可以这样做,还是有点懵,既然不懂那就死记硬背吧。

视野总和

描叙:有n个人站队,所有的人全部向右看,个子高的可以看到个子低的发型,给出每个人的身高,问所有人能看到其他人发现总和是多少。
输入:4 3 7 1
输出:2

解释:个子为4的可以看到个子为3的发型,个子为7可以看到个子为1的身高,所以1+1=2
思路:观察题之后,我们发现实际上题目转化为找当前数字向右查找的第一个大于他的数字之间有多少个数字,然后将每个结果累计就是答案。

    public static int calculateFieldSum(int[] heights) {
        int n = heights.length;
        Stack<Integer> stack = new Stack<>();
        int sum = 0;

        for (int i = 0; i < n; i++) {
            while (!stack.isEmpty() && heights[i] >= heights[stack.peek()]) {
                stack.pop();
            }
            sum += stack.size();
            stack.push(i);
        }

        return sum;
    }

柱状图中最大的矩形

这一题,自己先用普通的栈去实现,但是发现只能解决部分问题,存在局限性(也有可能是能力不足哈哈不会写)然后看了答案以后可以使用单调栈来实现。这一题的思路其实很简单,但是如果暴力的话肯定会超时的而且比较麻烦,所以可以用单调栈来解决,设计一个单调递增栈来解决问题,一旦出现有元素小于栈顶,则开始计算目前的矩形最大面积是多少。不过这一题里面加了两个零边界值,目前刚学,没有发现这两个零的特殊作用,查阅资料后才恍然大悟:

在这个算法中,将原始数组 heights 的长度加2,并在新数组 m 的开头和末尾分别设置为0,是为了处理边界情况。

在解决最大矩形面积问题时,需要考虑到矩形的边界情况。通过在 m 数组的开头和末尾添加高度为0的元素,可以确保栈中的元素都能找到对应的左边界和右边界。

具体来说,在遍历 m 数组时,当遇到一个元素小于栈顶元素时,表示栈顶元素的右边界确定,可以计算以栈顶元素为高度的矩形的面积。如果没有添加开头和末尾的0元素,那么在某些情况下,栈中的元素可能无法找到对应的左边界或右边界,导致计算面积时出现错误。

因此,通过在 m 数组的开头和末尾添加高度为0的元素,可以确保栈中的元素都能找到对应的左边界和右边界,从而正确计算最大矩形面积。

比如说:2 1 5 6 2 3 这个数据

我们如果不设置两个0的话,那么我们数据遍历完后,栈中其实还是有数据的。如果栈中的数据是最大值的话,因为我们最后设置了个0,又因为本题数据0 <= heights[i] <= 10000,所以最后一次计算的时候,也会把剩余的栈中元素再计算他们的最大矩形值。

题目如下:

代码如下,开袋即食:

class Solution {
    public int largestRectangleArea(int[] heights) {
        if(heights.length==1) return heights[0];
        int res = 0;
        Stack<Integer> s = new Stack<>();
        int[] newH = new int[heights.length+2];
        newH[0] = 0;
        newH[heights.length+1]=0;

        for(int i = 1 ; i<heights.length+1;i++){
            newH[i] = heights[i-1];
        }
        for(int i = 0;i<newH.length;i++){
            while(!s.isEmpty()&&newH[i]<newH[s.peek()]){
                int p = s.pop();
                int h = newH[p];
                int leftIndex = s.peek();
                int w = i-leftIndex-1;
                res = Math.max(res,h*w);
            }
            s.push(i);
        }
        return res;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

caffe搭建squeezenet网络的整套工程

之前用pytorch构建了squeezenet&#xff0c;个人觉得pytorch是最好用的&#xff0c;但是有的工程就是需要caffe结构的&#xff0c;所以本篇也用caffe构建一个squeezenet网络。 数据处理 首先要对数据进行处理&#xff0c;跟pytorch不同&#xff0c;pytorch读取数据只需要给数据…

第六章《凸优化核心过程:真正搞懂梯度下降过程》

优化问题可以分为凸优化问题和非凸优化问题&#xff0c;凸优化问题是指定义在凸集中的凸函数最优化的问题&#xff0c;典型应用场景就是 目标函数极值问题的求解。凸优化问题的局部最优解就是全局最优解&#xff0c;因此 机器学习中很多非凸优化问题都需要被转化为等价凸优化问…

【链接装载与库】动态链接(下)

动态链接 》上篇《 延迟绑定 (PLT) 动态链接的确有很多优势&#xff0c;比静态链接要灵活得多&#xff0c;但它是以牺牲一部分性能为代价的。主要原因是动态链接下对于全局和静态的数据访问都要进行复杂的GOT定位&#xff0c;然后间接寻址&#xff1b;对于模块间的调用也要先…

Go RabbitMQ简介 使用

RabbitMQ简介 RabbitMQ 是一个广泛使用的开源消息队列系统&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准&#xff0c;为分布式应用程序提供了强大的消息传递功能。RabbitMQ 是 Erlang 语言编写的&#xff0c;具有高度的可扩展性和可靠性&#xff0c;…

普洱茶上市?澜沧古茶通过港股聆讯

近日&#xff0c;澜沧古茶成功通过港交所聆讯&#xff0c;随后在11月7日披露了相关资料集。该公司即将在港交所主板上市&#xff0c;此次上市由中信建投国际和招商证券国际担任联席保荐人。据了解&#xff0c;澜沧古茶或将成为内地茶企第一股&#xff0c;也将成为“普洱茶第一股…

el-form-item的label的长度单独改掉,用vue3样式穿透的写法,加上css选择器查找特定的id拿到元素

为了让这个会员卡号这几个字和下面的表格对齐&#xff0c;需要改el-form-item的label的长度 如果直接改el-form的label-width,那么所有的el-form-item的label都会改&#xff0c;我不希望这样 我希望只改第1个会员卡号的label长度 给这个el-form-item添加一个id :deep(.el-for…

漏洞复现--泛微E-Office信息泄露(CVE-2023-2766)

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

xshell隧道设置

现在有远程外网地址 120.120.120.120和另一台内网地址192.168.1.110两台cvm 但是192.168.1.110 无法直接通过外网地址访问, 需要通过120.120.120.120建立隧道来连接 需要访问192.168.1.110 机器的3306端口, 可以这么做 将192.168.1.110 的3306映射到本地13306端口 1.连接外网…

YOLOv8-Seg改进:多尺度空洞注意力(MSDA),增强局部、稀疏提取特征能力

🚀🚀🚀本文改进: 新的注意力机制——多尺度空洞注意力(MSDA)。MSDA 能够模拟小范围内的局部和稀疏的图像块交互; 如何在OLOv8-seg下使用:1)作为注意力机制放在各个网络位置;2)与C2f结合替代原始的C2f 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLS…

人工智能辅助职业教育发展——开启教育新时代

人工智能辅助职业教育发展——开启教育新时代 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;逐渐渗透到各行各业&#xff0c;并在许多领域发挥着重要作用。如今&#xff0c;AI的应用已经延伸到职业教育领域&#xff0c;为培养高素质人才提供了新的可能和动…

用户交互引导大模型生成内容特征,LLM-Rec框架助力个性化推荐!

欢迎来到魔法宝库&#xff0c;传递AIGC的前沿知识&#xff0c;做有格调的分享❗ 喜欢的话记得点个关注吧&#xff01; 今天主要和大家分享一篇使用大语言模型做数据增强来提升推荐系统性能的研究 标题&#xff1a; LLM-Rec: Personalized Recommendation via Prompting Large …

2023软件测试必问的100个面试题【含答案】

一、测试理论 1.什么是软件测试&#xff1f; 答&#xff1a;软件测试是通过执行预定的步骤和使用指定的数据&#xff0c;以确定软件系统在特定条件下是否满足预期的行为。 2.测试驱动开发&#xff08;TDD&#xff09;是什么&#xff1f; 答&#xff1a;测试驱动开发是一种开…

基于情感分析+聚类分析+LDA主题分析对服装产品类的消费者评论分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

MKL.NET:为.NET开发者提供高性能数学计算支持的开源库

目录 01 项目简介02 主要功能03 项目结构04 项目地址 MKL是英特尔推出的一套功能强大、性能优化的数学库&#xff0c;主要是采用C/C编写的。今天给大家推荐一个MKL的.Net版本&#xff0c;让我们无需与C/C打交道&#xff0c;方便我们集成到应用开发中去。 01 项目简介 MKL.NET…

智能机器人云控平台

智能机器人云控平台主要是通过打造一个低速固定场景下的机器人自主完成既定作业的模式。整体平台融合的自动化驾驶感知终端&#xff0c;物联网通信&#xff0c;数据接入中心&#xff0c;数据管理中心&#xff0c;模型中心及开放中心等&#xff0c;以一个云平台来掌控多个多种不…

ElementUI的Dialog弹窗实现拖拽移动功能

实现ElementUI的Dialog弹窗可以拖拽移动 实现步骤&#xff1a; 1.创建自定义指令 在utils文件夹下新建文件夹 utils/directive/el-dragDialog/index.js import drag from ./dragconst install function(Vue) {Vue.directive(el-drag-dialog, drag) }if (window.Vue) {windo…

电机应用-步进电机

步进电机&#xff08;脉冲电机&#xff09; 基于最基本的电磁铁原理&#xff0c;是一种可以自由回转的电磁铁&#xff0c;其工作原理是依靠气隙磁导的变化来产生电磁转矩。 由于步进电机是一个可以把电磁脉冲转换成机械运动的装置&#xff0c;具有很好的数据控制特性&#xff0…

解决问题:IDEA启动微服务项目,显示Loaded classes are up to date. Nothing to reload.

先说结论&#xff0c;再讲相声&#xff1a; 开启Shorten Command Line 选择JARmanifest 今天启动微服务&#xff0c;就有这么寸&#xff0c;其他的服务启动的好好的&#xff0c;唯独我需要Debug的项目无法启动&#xff0c;只能Run运行 满世界找答案无非就是几种&#xff1a;…

第二证券:今日投资前瞻:PPP迎来新机制,消费电池需求有望迎来复苏

11月8日&#xff0c;两市股指盘中轰动回落&#xff0c;尾盘逐渐止跌。到收盘&#xff0c;沪指跌0.16%报3052.37点&#xff0c;深成指微跌0.04%报10052.09点&#xff0c;创业板指涨0.02%报2023.13点&#xff0c;科创50指数涨0.92%&#xff1b;两市估计成交10366亿元&#xff0c;…

图文详解 VCF 生信格式 (变异信息)

文章目录 一、vcf 格式介绍二、vcf 资源文件三、vcf 文件详解3.1 主要字段3.2 INFO 中的常见信息3.3 FORMAT 和 SAMPLEs 中的信息 四、vcf 的记录模式4.1 只记录变异本身的信息4.2 记录个体或个体组织的变异信息4.3 记录群体或家系的变异信息 五、记录标准5.1 记录多核苷酸多样…