单调栈的使用

2023-10-27

一、介绍

单调栈,顾名思义就是栈内元素是有单调性的栈,单调栈在入栈的时候,需要将待入栈的元素和栈顶元素进行对比,看待加入栈的元素入栈后是否会破坏栈的单调性,如果不会,直接入栈;否则一直弹出到满足条件为止。

单调栈何时用:为任意一个元素找左边和右边第一个比自己大/小的位置可以使用单调栈.

由于每个元素最多各自进出栈一次,复杂度是O(n).

二、单调栈的模板

stack<int> st;
//此处一般需要给数组最后添加结束标志符,具体下面例题会有详细讲解
for (遍历这个数组){
    if (栈空 || 栈顶元素大于等于当前比较元素){
        入栈;
    }else{
        while (栈不为空 && 栈顶元素小于当前元素){
            栈顶元素出栈;
            更新结果;
        }
        入栈;
    }
}

或者简化为:
//此处一般需要给数组最后添加结束标志符,具体下面例题会有详细讲解
for (遍历这个数组){
    while (栈不为空 && 栈顶元素小于当前元素){  //这里栈为单调不减
        栈顶元素出栈;
        更新结果;
    }
    入栈;
}

三、实例

分析:

可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int length = temperatures.size();
        vector<int> res(length, 0);
        stack<int> stackTemp;
        for (int i = 0; i < temperatures.size(); ++i) {
            // 栈不为null,当前的值大于栈顶
            while (!stackTemp.empty() && temperatures[i] > temperatures[stackTemp.top()]) {
                auto index = stackTemp.top(); // 获取栈顶
                stackTemp.pop();
                res[index] = i - index; // 计算索引
            }
            stackTemp.push(i);
        }
        return res;
    }
};

参考:

[数据结构]——单调栈_lucky52529的博客-CSDN博客_什么是单调栈

单调栈简介_未闻名的博客-CSDN博客

力扣

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单调栈的使用 的相关文章

随机推荐

  • Java-1.10

    题目描述 假设一个人45分30秒跑了14千米 编写程序 显示他以每小时多少英里为单位的平均速度 1英里约等于1 6千米 代码 public class Speed public static void main String args do
  • 矩阵简述

    矩阵加法 C ij A ij B ij 矩阵数乘 将该数与每一个元素相乘 矩阵乘法 设A大小为n m B大小为m p 则A和B的乘积得到的矩阵大小为n p 其中每一项 AB ij sum k 1 m A ik B kj 矩阵乘法不满足交换律
  • docker安装配置goland

    第一步 确保已经安装好docker 第二步 拉取最新的go版本 docker pull golang 第三步 查询镜像 展示所有的镜像 docker images 第四步 启动容器 docker run itd p 8081 8081 v
  • 慧荣SM3271AD芯片U盘量产

    优化方式可以默认的 容量优先 设置2个盘 一个可以引导的光驱 一个存储用的磁盘 开始刷机 看看系统 上认到的磁盘状态 测试用U盘光驱引导启动 顺利完成 量产工具 地址 https download csdn net download ive
  • Java实现excel导出功能的几种方法——poi、easyExcel、easypoi、jxl

    推荐使用easyExcel 简单好用 对于稍微复杂一点的表格 个人建议用jxl easypoi 以下代码中包含的操作 合并单元格 设置字体格式 加粗 字体大小 颜色 设置单元格格式 居中 边框 背景颜色 填充数据 一 jxl jxl jxl
  • 基础排序算法-快排的非递归和归并的具体实现

    目录 快排的非递归实现 归并排序 归并排序的非递归实现 内 外排序 上文 7大排序算法 堆排 快速排序 精解 luck 的博客 CSDN博客 堆排序 快速排序 快排的非递归实现 我们知道快排的实现效率很高 但是它还是有个弊端 就是我们本身栈
  • mac 电脑找不到服务器 dns 地址,MAC OS下如何快速设置DNS服务器地址

    楼主你好 介绍以下Mac OS X DNS设置方法 1 点击桌面顶部状态栏里的苹果图标 在菜单里选择 系统偏好设置 2 点击互联网与无线下的 网络 3 在网络界面 选中正在联网的网络连接 点击右下角的 高级 选项 4 在高级选项设置窗口中
  • 微服务的艺术:构建可扩展和弹性的分布式应用

    文章目录 引言 微服务的关键特点 1 小型化 2 独立性 3 通信 4 自动化 构建微服务 1 项目拆分 2 数据管理 3 通信 4 部署和容器化 5 监控和日志 6 弹性和容错性 最佳实践和工具 1 Spring Boot 2 Kuber
  • Studio设计布局的新姿势

    目录 ConstraintLayout基本界面 ConstraintLayout约束类型 尺寸约束 边界约束 基准线约束 清除约束 约束示例 自动约束Autoconnect 约束推断Inference View Inspector Fixe
  • [WSL2+ROS (就不用虚拟机] 无法使用图形界面

    按照教程 rosrun打开小乌龟时失败 尝试查找原因发现wsl被微软阉割过没有图形界面 按照教程 转载安装VcXsrv图形界面 到这一步时如教程所说出现Cant open display的错误 更改DISPLAY 依旧报错 头痛 后尝试将D
  • ubuntu系统常用软件工具

    1 terminator Ubuntu系统默认没有安装Terminator 我们可以使用apt get命令从Ubuntu的软件源中下载并安装该软件 在GNOME集成桌面环境中 打开一个终端窗口 输入以下命令 sudo apt get ins
  • 百度飞桨PicoDet 目标检测介绍

    4 head 4 1 cls分类信息 4 2 reg位置回归信息 Generalized Focal Loss 重点是边框回归的位置信息 这里和常规的Anchor box的回归方式不一样 采用的是Generalized Focal Loss
  • 自媒体素材网站有哪些?推荐几个常用的素材网站

    无论是写公众号图文 还是剪辑视频 都需要大量的素材 所以就跟大家介绍一下素材类的网站 1 视频类素材 第一批 就是一些无版权的素材网站 Pexel Video Pexel Video Pexel Video Mazwai等 这些网站里面的视
  • 接口测试之Fiddler抓包,定位接口测试问题详细教程

    Fiddler应用实战 面试必问且测试必会的技术 一 Fiddler部署与原理 1 Fiddler是什么 Fiddler是位于客户端和服务器端的HTTP代理 也是目前最常用的http抓包工具之一 什么是包 什么抓包 什么情况下需要抓包 我们
  • 缓存服务——Redis集群简介

    文章目录 缓存服务 Redis集群 一 Redis简介 1 Redis软件获取和帮助 2 Redis特性 3 企业缓存数据库解决方案对比 4 Redis应用场景 二 Redis基本部署 1 编译安装最新版本redis 2 配置启动数据库 3
  • MakeFile学习2-语法

    makefile语法 什么是makefile makefile定义了一系列的规则来指定 哪些文件需要先编译 哪些文件需要重新编译 如何进行链接等操作 makefile就是自动化编译 告诉make命令如何编译和链接 makefile里有什么
  • 【开发工具】JetBrains

    文章目录 设置 插件 字体 设置 File Settings Appearance Behavior Appearance Theme IntelliJ Light Use custom font JetBrains Mono ExtraL
  • web编程自动化测试_2020年用于测试自动化的7种顶级编程语言

    web编程自动化测试 因此 您正处于2020年初 您可能已将一个新的决议作为测试人员投入到自动化测试中来 但是 要自动化测试脚本 您需要动手学习一种编程语言 这就是您的难处 或者您已经精通一种编程语言进行自动化测试 并且正在考虑尝试使用新的
  • 算法 - C语言实现希尔排序(Shell_sort)

    目录 什么是希尔排序 希尔排序的使用场景 通过排序之间的比较引入希尔排序 演示希尔排序的过程 第一趟排序 第二趟排序 第三趟排序 第四趟排序 程序验证 程序代码 现实生活中的希尔排序 对希尔排序的总结 什么是希尔排序 在写希尔排序的代码之前
  • 单调栈的使用

    一 介绍 单调栈 顾名思义就是栈内元素是有单调性的栈 单调栈在入栈的时候 需要将待入栈的元素和栈顶元素进行对比 看待加入栈的元素入栈后是否会破坏栈的单调性 如果不会 直接入栈 否则一直弹出到满足条件为止 单调栈何时用 为任意一个元素找左边和