代码随想录第51天|单调栈

news2024/9/21 22:47:25

42. 接雨水

在这里插入图片描述
参考

思路1: 暴力解法

  • 找每个柱子的左右高度
  • 超时 O(N^2)
    在这里插入图片描述

思路2: 双指针优化
请添加图片描述

class Solution {
public:
    int trap(vector<int>& height) {
        vector<int> lheight(height.size(), 0);
        vector<int> rheight(height.size(), 0);

        lheight[0] = height[0];
        for (int i = 1; i < height.size(); i++) {
            lheight[i] = max(lheight[i - 1], height[i]);
        }
        rheight[height.size() - 1] = height[height.size() - 1];
        for (int i = height.size() - 2; i >= 0; i--) {
            rheight[i] = max(rheight[i + 1], height[i]);
        }
        int res = 0;
        for (int i = 0; i < height.size(); i++) {
            if (i == 0 || i == height.size() - 1) continue;

            int min_val = min(lheight[i], rheight[i]);
            if (min_val - height[i] > 0) res += min_val - height[i];
        }
        return res;
    }
};

思路3: 单调栈
请添加图片描述

class Solution {
public:
    int trap(vector<int>& height) {
        int res = 0;
        stack<int> mystack;
        mystack.push(0);
        for (int i = 1; i < height.size(); i++) {
            if (height[i] < height[mystack.top()]) {
                mystack.push(i);
            } else if (height[i] == height[mystack.top()]) {
                mystack.push(i);
            } else {
                while (!mystack.empty() && height[i] >= height[mystack.top()]) {
                    int right = i;
                    int mid = mystack.top();
                    mystack.pop();
                    if (mystack.empty()) break;//元素数量不满足时, 无需回退上一步的pop操作, 放心舍弃元素(构不成封闭区间)
                    int left = mystack.top();

                    int w = right - left - 1;
                    res += (min(height[left], height[right]) - height[mid]) * w;
                }
                mystack.push(i);
            }
        }
        return res;
    }
};
//对比: 细节处理存在问题, 虽然能通过, 实际上并不是单调栈(首元素的影响)
while (mystack.size() > 1 && height[i] >= height[mystack.top()]) {
     int right = i;
     int mid = mystack.top();
     mystack.pop();
     int left = mystack.top();

     int w = right - left - 1;
     if (min(height[left], height[right]) - height[mid] > 0)
         res += (min(height[left], height[right]) - height[mid]) * w;
}

在这里插入图片描述


84.柱状图中最大的矩形

在这里插入图片描述

思路: 单调栈
和接雨水相似, 区别在栈内元素轻的沉底
首插入0避免出现栈内元素不满足2的情况(如 3 1 2)
尾插入0避免出现一直满足栈条件而无法收获结果的情况(如 2 3 4 5)
请添加图片描述

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        stack<int> mystask;
        mystask.push(0);
        int res = 0;
        for (int i = 1; i < heights.size(); i++) {
            if (heights[i] > heights[mystask.top()]) {
                mystask.push(i);
            } else if (heights[i] == heights[mystask.top()]) {
                mystask.push(i);
            } else {
                while (!mystask.empty() &&
                       heights[i] < heights[mystask.top()]) {
                    int right = i;
                    int mid = mystask.top();
                    mystask.pop();
                    if (!mystask.empty()) {
                        int left = mystask.top();
                        int tem = (right - left - 1) * heights[mid];
                        res = max(res, tem);
                    }
                }
                mystask.push(i);
            }
        }
        return res;
    }
};

思路: 双指针
实现方式不同, 此处存放的是下标索引

请添加图片描述

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int res = 0;
        vector<int> L_index(heights.size());
        vector<int> R_index(heights.size());

        for (int i = 0; i < heights.size(); i++) {
            int t = i;
            while (t > 0 && heights[t - 1] >= heights[i]) 
                t = L_index[t - 1];//若改为 t--则会超时
            L_index[i] = t;
        }
        for (int i = heights.size() - 1; i >= 0; i--) {
            int t = i;
            while (t + 1 < heights.size() && heights[i] <= heights[t + 1]) 
                t = R_index[t + 1];
            R_index[i] = t;
        }

        for (int i = 0; i < heights.size(); i++) {
            int W = R_index[i] - L_index[i] + 1;
            int tem = W * heights[i];
            res = max(res, tem);
        }
        return res;
    }
};

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

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

相关文章

【超音速 专利 CN117576413A】基于全连接网络分类模型的AI涂布抓边处理方法及系统

申请号CN202311568976.4公开号&#xff08;公开&#xff09;CN117576413A申请日2023.11.22申请人&#xff08;公开&#xff09;超音速人工智能科技股份有限公司发明人&#xff08;公开&#xff09;张俊峰&#xff08;总&#xff09;; 杨培文&#xff08;总&#xff09;; 沈俊羽…

Python酷库之旅-第三方库Pandas(021)

目录 一、用法精讲 52、pandas.from_dummies函数 52-1、语法 52-2、参数 52-3、功能 52-4、返回值 52-5、说明 52-6、用法 52-6-1、数据准备 52-6-2、代码示例 52-6-3、结果输出 53、pandas.factorize函数 53-1、语法 53-2、参数 53-3、功能 53-4、返回值 53-…

网络割接方案通用模板

第一章 项目概述 1.1 编写目的 为规范“十三五”以来&#xff0c;随着移动互联新技术的发展以及我国政府职能的不断转变&#xff0c; 我国的政法网络进入新的发展阶段&#xff0c;跨地域、跨部门、跨系统的信息共享、业务 协同以及智慧政务等成为了各地电子政务的重点建设内容。…

【Django+Vue3 线上教育平台项目实战】构建高效线上教育平台之首页模块

文章目录 前言一、导航功能实现a.效果图&#xff1a;b.后端代码c.前端代码 二、轮播图功能实现a.效果图b.后端代码c.前端代码 三、标签栏功能实现a.效果图b.后端代码c.前端代码 四、侧边栏功能实现1.整体效果图2.侧边栏功能实现a.效果图b.后端代码c.前端代码 3.侧边栏展示分类及…

自动化故障排查与运维团队建设策略

在当前的运维领域&#xff0c;自动化故障排查已成为提高运维效率、保障系统稳定性的关键手段。为了进一步提升故障排查能力&#xff0c;并建立高效的运维团队&#xff0c;以下策略值得深入考虑和实施。 一、自动化故障排查流程与工具 标准化故障排查流程 建立一套标准化的故…

121. 小红的区间翻转(卡码网周赛第二十五期(23年B站笔试真题))

题目链接 121. 小红的区间翻转&#xff08;卡码网周赛第二十五期&#xff08;23年B站笔试真题&#xff09;&#xff09; 题目描述 小红拿到了两个长度为 n 的数组 a 和 b&#xff0c;她仅可以执行一次以下翻转操作&#xff1a;选择a数组中的一个区间[i, j]&#xff0c;&#x…

Nginx入门到精通五(动静分离)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通一&#xff08;基本概念介绍&#xff09;-CSDN博客 Nginx入门到精通二&#xff08;安装配置&#xff09;-CSDN博客 Nginx入门到精通三&#xff08;Nginx实例1&#xff1a;反向代理&a…

全球生成式AI 产品分析报告

全球生成式AI 产品研究报告 时代背景 全球进入AI驱动的生产革命&#xff0c;生成式技术是时代际遇。中美在生成式AI产业展开科技竞争&#xff0c;全栈组合拳拉锯发展。‍ 技术变革 Transformer架构优化模型泛化的训推能力与理解生成的内容能力。文本模态达高应用成熟度&…

OpenCV图像处理——获取穿过圆的直线与圆相交的两个点

在OpenCV中&#xff0c;没有直接的函数来计算直线与圆的交点&#xff0c;但可以通过数学方法来实现这一功能。以下是计算直线与圆交点的步骤&#xff0c;以及相应的C代码示例&#xff1a; 确定直线方程&#xff1a;使用直线上的两个点 P 1 ( x 1 , y 1 ) P1(x1, y1) P1(x1,y1)和…

旷野之间17 - 适合所有人的 Transformer

最初出现在著名论文《Attention is all your need》中&#xff0c;基于Transformer的架构已成为大多数成功的人工智能模型中必不可少的。 然而&#xff0c;许多用户甚至基于人工智能的产品的创造者可能不了解Transformer是什么或它是如何工作的。 嗯&#xff0c;阅读研究论文…

MVC之 IHttpModule管道模型《二》

》》》注意&#xff1a;在http请求的处理过程中&#xff0c;只能调用一个HttpHandler&#xff0c;但可以调用多个HttpModule。 HTTP Modules ASP.NET请求处理过程是基于管道模型的&#xff0c;这个管道模型是由多个HttpModule和HttpHandler组成&#xff0c;当请求到达HttpMod…

Linux 扩展硬盘容量

根分区的硬盘容量不够了需要添加容量 扩展硬盘容量前提是需要虚拟机关机才能进行以下操作 在虚拟中找到虚拟机设置 >> 点击硬盘 >> 选择扩展 >> 输入自已要扩展的大小 >> 确定 这些设置好之后&#xff0c;启动虚拟机 fdisk /dev/sda n p 三个回车…

Nginx入门到精通七(Nginx原理)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通一&#xff08;基本概念介绍&#xff09;-CSDN博客 Nginx入门到精通二&#xff08;安装配置&#xff09;-CSDN博客 Nginx入门到精通三&#xff08;Nginx实例1&#xff1a;反向代理&a…

基于matlab的SVR回归模型

1 原理 SVR&#xff08;Support Vector Regression&#xff09;回归预测原理&#xff0c;基于支持向量机&#xff08;SVM&#xff09;的回归分支&#xff0c;其核心思想是通过寻找一个最优的超平面来进行回归预测&#xff0c;并处理非线性回归问题。以下是SVR回归预测原理的系统…

猴子吃桃(迭代算法)

猴子与桃纠缠 传说很久很久以前&#xff0c;一只小猴子听妈妈的话&#xff0c;不远万里&#xff0c;爬山涉水专门跑到王母娘娘的蟠桃园里偷桃子吃&#xff0c;小猴子趁王母娘娘闭关修炼&#xff0c;偷了许多桃子&#xff0c;直到被蟠桃园的守卫发现&#xff0c;才恋恋不舍的逃走…

AWS-S3实现Minio分片上传、断点续传、秒传、分片下载、暂停下载

文章目录 前言一、功能展示上传功能点下载功能点效果展示 二、思路流程上传流程下载流程 三、代码示例四、疑问 前言 Amazon Simple Storage Service&#xff08;S3&#xff09;&#xff0c;简单存储服务&#xff0c;是一个公开的云存储服务。Web应用程序开发人员可以使用它存…

oracle数据库的plsql免安装版安装

这个是连接oracle数据库的&#xff0c;注意安装不能有中文路径。以下只是示例。 1、打开D:\ruanjian\plsql\plsql\plsql&#xff0c;发送plsqldev.exe快捷方式到桌面。 2、新弹出的页面填写cancel,什么也不写。 3、将instanceclient解压&#xff0c;并复制文件路径。 修改tool…

mysql5.7版本字符集编码

默认character_set_databaselatin1 当你字段插入中文值的时候&#xff0c;会报错。 所以修改为了character_set_databaseutf8既可以。 character_set_server他的范围更大&#xff0c;属于服务器级别。

非常好的新版网盘系统,是一款PHP网盘与外链分享程序,支持文件预览

这是一款PHP网盘与外链分享程序&#xff0c;支持所有格式文件的上传&#xff0c; 可以生成文件外链、图片外链、音乐视频外链&#xff0c;生成外链同时自动生成相应的UBB代码和HTML代码&#xff0c; 还可支持文本、图片、音乐、视频在线预览&#xff0c;这不仅仅是一个网盘&a…

【Java】 条件与选择

文章目录 1.关系操作符2.逻辑操作符3.if语句3.1常见的问题3.2 两个浮点数值的相等测试3.3 简化布尔赋值 4.switch语句5.三元操作符 1.关系操作符 Java 提供六种关系操作符(relational operator)(也称为比较操作符(comparison operator)) 操作符名称<小于<小于等于>大…