数据结构:单调栈

news2024/11/18 22:38:51

1.单调栈

     单调栈是一种数据结构,其中存放的数据应该是有序的,所以单调栈也有单调递减栈单调递增栈

单调递增栈:栈顶到栈底的元素大小是从小到大
单调递减栈:栈顶到栈底的元素大小是从大到小

     单调栈主要就是用来求一个给定序列中每个数左边离它最近的比它大或小的数。如果找的是比它小的数,就是构造一个单调递减栈;如果找的是比它大的数,那构造的就是一个单调递增栈。

2.单调栈模拟

      假如我们现在有一个序列10,2,8,5,13,我们要找每个数离它最近的比它大的数,我们要构造一个单调递增的栈,则如果栈为空或者入栈的元素大小小于栈顶值,就入栈,否则入栈会破坏栈的单调性,这时候比入栈元素小的元素全部出栈。

      10入栈时,栈为空,直接入栈,栈有一个元素10;

      2入栈时,栈顶元素10比2大,则入栈,栈内元素为10和2;

      8入栈时,栈顶元素2比8小,则栈顶元素出栈,此时栈顶元素为10,比8大,8可以入栈,栈内元素为10和8;

     5入栈时,栈顶8比5大,可以入栈,栈内元素为10,8,5;

     13入栈时,栈顶元素5比13小,出栈;8比13小,出栈;10比13小,出栈,最后栈为空,13入栈,栈内只有12。

      单调递减栈的原理和递增类似

代码:

C:
//构造单调递增栈
int top=0;
for(int i=0;i<n;i++)
{
   if(top==0||stk[top]>=i}
   {
     stk[++top]=i;//当前元素入栈
   }
   else
   {
      while(top&&stk[top]<i)
      {
        top--;//出栈
      }
      stk[++top]=i;//当前元素入栈
   }
}

//构造单调递减栈
int top=0;
for(int i=0;i<n;i++)
{
   if(top==0||stk[top]<=i}
   {
     stk[++top]=i;//当前元素入栈
   }
   else
   {
      while(top&&stk[top]>i)
      {
        top--;//出栈
      }
      stk[++top]=i;//当前元素入栈
   }
}
 C++:
//构造单调递增栈
stack<int>stk;
for(int i=0;i<n;i++)
{
  while(!stk.empty()&&stk.top()<i)
  {
    stk.pop()
  }
   stk.push(i);
}

//构造单调递减栈
stack<int>stk;
for(int i=0;i<n;i++)
{
  while(!stk.empty()&&stk.top()>i)
  {
    stk.pop()
  }
   stk.push(i);
}

 3.单调栈应用(C++)

     其实我们可以看到这也是类似最近匹配的问题,栈最擅长这种问题了

3.1 每日温度

vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> res(temperatures.size(), 0);
        stack<int> stk;
        for (int i = 0; i < temperatures.size(); ++i) {
            while (!stk.empty() && temperatures[stk.top()] < temperatures[i]) {
                res[stk.top()] = i - stk.top();
                stk.pop();
            }
            stk.push(i);
        }
        return res;
    }

      给定一个温度序列,让你求每个温度离它最近的比它高的温度是之后第几天,显然符合单调递增栈的特征,我们定义一个栈stk来存储每个温度对应的下标和存储结果的vector数组res,从头开始遍历,如果栈为空或者栈顶下标对应的温度大于当前温度值,则当前温度对应的下标入栈;如果不为空且栈顶下标对应的温度小于当前温度值,说明我们找到了这个温度离它最近的比它高的温度值,那我们就把两个温度对应天数的差值放入res数组中,即res[stk.top()]=i-stk.top(),然后再让栈顶元素出栈,把这个温度对应的下标入栈即可,最后返回结果数组res。

3.2 接雨水

int trap(vector<int>& height) {
      int ans=0;
      stack<int>st;
      for(int i=0;i<height.size();i++)
      {
          while(!st.empty()&&height[st.top()]<height[i])
          {
              int cur=st.top();
              st.pop();
              if(st.empty())break;
              int l=st.top();
              int r=i;
              int h=min(height[l],height[r])-height[cur];
              ans+=(r-l-1)*h;
          }
          st.push(i);
      }
      return ans;
    }

       这是一个单调递减栈,当我们找到一根比前面高的柱子时,就可以计算接到的雨水了。更低的柱子我们就入栈,当出现高于栈顶的柱子时,我们就可以计算已经接到的雨水,然后出栈把当前当前的柱子入栈。

        需要注意的是,雨水的右边r是当前的索引i,底部是栈顶st.top(),因为遇到了更高的柱子,所以雨水的左边即将出栈,使用cur来记录它,l就是新的栈顶,这样雨水的区域就确定了,高度就是左右两边更低的一边减去底部,宽度就是左右中间。

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

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

相关文章

【Proteus】swjtu西南交大微机原理与接口技术课设:8086 最小模式下的最简硬件核设计

一、实验目的 让学生深入理解计算机硬件的基本组成结构、工作原理和设计方法&#xff0c;掌握 16 位微处理 器&#xff08;如 8086&#xff09;的内部结构和原理&#xff0c;并能够通过实际操作实现对其功能的在线调试和验证。 这样可以加深对计算机系统的认识和理解&#xff…

技术太难,人工太慢,这才是最牛的温湿度监控工具!

随着科技的不断进步和各行业的发展&#xff0c;温湿度监控已经成为确保产品质量、维护设备安全以及提高工作环境效能的关键工具。 在这个信息时代&#xff0c;实时、精准的温湿度数据监测不仅为企业带来了飞速的发展&#xff0c;也为行业发展注入了新的活力。 客户案例 医疗行…

Checkpoint 执行机制原理解析

在介绍Checkpoint的执行机制前&#xff0c;我们需要了解一下state的存储&#xff0c;因为state是Checkpoint进行持久化备份的主要角色。Checkpoint作为Flink最基础也是最关键的容错机制&#xff0c;Checkpoint快照机制很好地保证了Flink应用从异常状态恢复后的数据准确性。同时…

golang连接mysql的第一个程序(最新)

不想多说话&#xff0c;先把golang和mysql连接好&#xff0c;环境配置好&#xff0c;然后直接上代码就行了&#xff0c;代码可直接运行。 package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" )func main() {// MySQL …

nvm 的安装及使用 (Node版本管理器)

目录 1、nvm 介绍 2、nvm安装 3、nvm 使用 4、node官网可以查看node和npm对应版本 5、nvm安装指定版本node 6、安装cli脚手架 1、nvm 介绍 NVM 全称 node.js version management &#xff0c;专门针对 node 版本进行管理的工具&#xff0c;通过它可以安装和切换不同版本的…

【SpringCloud笔记】(11)消息驱动之Stream

Stream 技术背景 底层不同模块可能使用不同的消息中间件&#xff0c;这就导致技术的切换&#xff0c;微服务的维护及开发变得麻烦起来 概述 官网&#xff1a; https://spring.io/projects/spring-cloud-stream#overview https://cloud.spring.io/spring-cloud-static/spring…

在Go语言中处理HTTP文件上传

大家好&#xff0c;我是你们可爱又迷人的编程小助手&#xff0c;今天要带你们一起探讨在Go语言中如何处理HTTP文件上传&#xff0c;让我们把这场技术之旅变得轻松有趣吧&#xff01; 首先&#xff0c;想象一下这个场景&#xff1a;你是一个网站的开发者&#xff0c;用户们急切…

pycharm 工具栏不见了

新版pycharm后&#xff0c; 菜单栏和工具栏不见了 目录 我发现的解决方法&#xff1a; 其他旧版的解决方法&#xff1a; 我发现的解决方法&#xff1a; 其他旧版的解决方法&#xff1a; 另外&#xff0c;一些使用pycharm的新手可能会由于不熟悉软件的功能而误操作&#xff…

文件夹共享(普通共享和高级共享的区别)防火墙设置(包括了jdk安装和Tomcat)

文章目录 一、共享文件1.1为什么需要配置文件夹共享功能&#xff1f;1.2配置文件共享功能1.3高级共享和普通共享的区别&#xff1a; 二、防火墙设置2.1先要在虚拟机上安装JDK和Tomcat供外部访问。2.2设置防火墙&#xff1a; 一、共享文件 1.1为什么需要配置文件夹共享功能&…

springboot对接WebSocket实现消息推送

1.修改pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.增加配置WebSocketConfig.java import org.springframework.context.annotation.Bean…

接口测试工具——ApiFox使用初体验 postman导出和ApiFox导入

目录 ApiFox使用初体验初步使用从postman导出到apifox导入 IDEA简单测试Postman测试工具post请求 接口测试工具swaggerKnife4j1.引入依赖2.配置3.常用注解4.接口测试 JMeter什么是JMeter?JMeter安装配置1.官网下载2.下载后解压3.汉语设置 JMeter的使用方法1.新建线程组2.设置参…

智能监控平台/视频共享融合系统EasyCVR海康设备国标GB28181接入流程

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

基于springboot的数码论坛系统设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 摘 要 网络的广泛应用给…

laravel api资源的问题记录

resource 转换层 可以帮助我们转换一些字段的结果&#xff0c;类似前端的filter。 可以使用比如对象或者模型的形式来处理&#xff0c;但使用sql查询会导致n1的问题。如图&#xff1a; 层次嵌套很多&#xff0c;而且很深&#xff0c;这样虽然开发方便了&#xff0c;但是维护就…

Mysql(5日志备份恢复)

一.日志管理 MySQL 的日志默认保存位置为 /usr/local/mysql/data 先看下mysql的日志文件有无&#xff1a; 修改配置文件添加&#xff1a;错误日志&#xff0c;用来记录当MySQL启动、停止或运行时发生的错误信息&#xff0c;默认已开启 修改配置文件添加&#xff1a;通用查…

PWR 电源控制-stm32入门

这一节我们来学习 STM32 的 PWR 电源控制。 其中&#xff0c;我们重点学习的主要就是 3 种低功耗模式&#xff1a;睡眠模式、停机模式和待机模式。 低功耗模式的目的呢&#xff1f;简单明了&#xff0c;就是省电&#xff0c;这对于一些使用电池供电&#xff0c;又需要长时间待…

腾讯云4核8G服务器轻量和CVM标准型S5对比

腾讯云4核8G服务器优惠价格表&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;阿腾云atengyun.com分享腾讯云4核8G服务器详细配置、优惠价格及限制条件&…

nodejs微信小程序+python+PHP基于Android自习室管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

基于ssm的电影评论系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装电影评论系统软件来发挥其高效地信息处理的作用&#xff0c…

电商低价 窜货问题怎么解决

渠道中最常见的问题一般都是围绕价格的&#xff0c;低价、窜货、假货问题尤为明显&#xff0c;经销商为了利益&#xff0c;总会进行价格的突破&#xff0c;窜货也是为了获得更多流量利润&#xff0c;也会变相低价&#xff0c;所以治理好低价、窜货问题&#xff0c;就是在管控渠…