代码随想录算法训练营第六十三天 | 42. 接雨水、84.柱状图中最大的矩形

news2024/11/27 11:50:36

42. 接雨水

文字讲解:代码随想录
视频讲解:单调栈,经典来袭!LeetCode:42.接雨水_哔哩哔哩_bilibili

解题思路

思路一:单调栈

我们要找到矩形作为底时,左边和右边第一个比它大的元素

 1.使用单调栈内元素的顺序

应该是从栈头到栈底,是从小到大的,因为一旦发现更大的了,就出现凹槽了,栈头左边第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子

 2.模拟过程

h[i] < h[st.top()]       直接加入到栈中

h[i] == h[st.top()]    弹出和直接加入都可,结果是一样的,只是计算过程不同,我们先按加入来算

h[i] > h[st.top()]      此时就发现凹槽了

        mid = st.top()      先存柱子底的下标,然后弹出,才能取左边的凹槽

        st.pop()

        h = min(st.top(),h[i]) - h[mid]        这一行雨水的高度

        w = i - st.top() - 1;                         这一行雨水的宽度

        s+=h*w

        然后重复处理,按照我们这种计算结果,那么遇到相同的情况,计算结果就为0,不影响结果

class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> st;
        int sum = 0;
        st.push(0);   //第一个元素入栈
        for(int i  = 1 ;i < height.size(); i++)
        {
            if(height[i]<height[st.top()] || height[i]==height[st.top()])
                st.push(i);
            else
            {
                while(!st.empty() && height[i]>height[st.top()])
                {
                     int mid = st.top();
                     st.pop();
                     if(!st.empty())    //因为有pop操作,还需要判断是否为空栈
                     {
                        int h = min(height[i],height[st.top()]) - height[mid];
                        int w = i - st.top() - 1;
                        sum+=h*w;
                     } 
                }
                st.push(i);
            }
        }
        return sum;
    }
};

84.柱状图中最大的矩形

文字讲解:代码随想录

视频讲解:单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形_哔哩哔哩_bilibili

解题思路

1.基础思路

假设我们遍历到6,左边和右边都比它小,无法扩展,因此面积为6*1

遍历的是5,左边是1,比它小,无法扩展,右边是6,比它大,可以扩展,面积为5*2

因此,我们只需要找左和右边第一个比它小的,这样就可以找到宽,高就是当前这个柱子

2.单调栈顺序

因为要找的是第一个比它小的,因此从栈顶到栈底是从大到小的,递减的

3.模拟过程

当遇到第一个小与栈口元素时

mid = st.top();

左边比它小的一定是遍历过的元素,也就是栈口元素旁边的元素

st.pop();

left = st.top();

right = i;

h = height[mid]

w = right - left -1          求的是中间的宽度

4.细节处理,首尾加0

如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。 如图:

 因此,尾部要加0

如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left,因为空栈我们不做处理,因此就跳过了

因此头部要加0

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
            stack<int> st;      //用栈来记录遍历过的元素
            heights.insert(heights.begin(),0);
            heights.push_back(0);
            st.push(0);
            int result = 0;
            for(int i = 1 ; i<heights.size();i++)
            {
                if(heights[i]>heights[st.top()])
                    st.push(i);
                else if(heights[i]==heights[st.top()])
                {
                    st.pop();
                    st.push(i);
                }
                else
                {
                    while(!st.empty() && heights[i]< heights[st.top()])
                    {
                        int mid = st.top();
                        st.pop();
                        if(!st.empty())
                        {
                            int left = st.top();
                            int right = i;
                            int h = heights[mid];
                            int w = right - left - 1;
                            result = max(result,h*w);
                        }
                    }
                    st.push(i);
                }
            }
            return result;
    }
};

明天就是图论开始!

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

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

相关文章

2024年退休金上调3%后一个扎心的现实。。。

个人原创&#xff0c;手写码字1050 你好&#xff0c;我是郭震 今天正式宣布&#xff0c;退休养老金上调3%&#xff1a; 1 现状分析 我对此做一些分析&#xff0c;从数据中帮助老铁们看清一些事实。 根据去年数据&#xff0c;农村老人1.2亿&#xff1a; 去年数据显示&#xff0c…

宝藏速成秘籍(8)基数排序法

一、前言 1.1、概念 基数排序法是一种非比较性的排序算法&#xff0c;通过将待排序的元素分割成独立的位数&#xff0c;然后按照每个位数的值进行排序。它可以用于对整数或字符串等数据类型进行排序。 1.2、排序步骤 确定待排序元素的位数&#xff0c;并根据最大位数创建对应…

LiveCharts2:简单灵活交互式且功能强大的.NET图表库

前言 之前的文章中提到过ScottPlot、与oxyplot&#xff0c;这两个是比较常用的.NET图表库&#xff0c;今天介绍一款新的.NET图表库&#xff1a;LiveCharts2。 LiveCharts2介绍 LiveCharts2 是一个现代化的数据可视化库&#xff0c;用于创建动态和交互式图表&#xff0c;支持…

分数限制下,选好专业还是选好学校

目录 1.概述 1.1.综合考虑 1.2.个人经验分享 2.专业解析 2.1. 计算机科学与技术 2.2. 英语 2.3. 法学 2.4.专业VS学校 2.5.建议 3.名校效应分析 3.1. 名校声誉&#xff08;品牌效应&#xff09; 3.2. 资源获取 3.3. 学术氛围 3.4. 就业优势 3.5.小结 4.好专业和…

移植案例与原理 - startup子系统之bootstrap_lite服务启动引导部件(1)

bootstrap_lite服务启动引导组件提供了各服务和功能的启动入口标识。在 SAMGR&#xff08;System ability manager&#xff0c;系统服务管理&#xff09; 启动时&#xff0c;会调用bootstrap_lite标识的入口函数&#xff0c;并启动系统服务。本文介绍下移植开发板时如何适配服务…

硬件电路基础【5.二极管】

二极管 前言一、基本原理1.1 介绍1.2 结构组成1.3 符号1.4 正负极判断 二、特性参数开关电路注意的参数极限特性电气特性特性曲线 三、应用场景稳压二极管原理故障特点连接方式参数最大额定参数电气特性特性曲线 应用典型的串联型稳压电路过压保护稳压二极管的应用与选择 肖特基…

MySql进阶:深入理解MySQL语句执行逻辑

深入理解MySQL语句执行逻辑 一、前言 本文源自微博客(www.microblog.store),且以获得授权 一直是想知道一条SQL语句是怎么被执行的&#xff0c;它执行的顺序是怎样的&#xff0c;然后查看总结各方资料&#xff0c;就有了下面这一篇博文了。   本文将从MySQL总体架构—&…

电商淘宝京东,精准关键词搜索API接口

当使用电商淘宝京东的精准关键词搜索API接口时&#xff0c;以下是清晰的步骤指南&#xff1a; 一、注册与申请API密钥 注册账号&#xff1a;在淘宝开放平台或京东开放平台注册成为开发者&#xff0c;并创建账号。 创建应用&#xff1a;登录后&#xff0c;在开放平台创建一个应…

运维技术栈总结

文章目录 Linux CommandBasecd/lschmod/chown/chgrpvi/vimscptarsudf Installrpmyumdeb/apt Filtertailgrepawkfindnetstatechotelnetwhereistouch/mkdirgzip/rar/tar Statistics Linux MonitorCPUtophtopsar Memoryfreevmstat I/Oiostatpidstatiotop Networknetstatiftoptcpdu…

网络编程3----TCP简单客户端服务器的实现

服务器的代码&#xff1a; package network;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.security.spec.RSAOtherPrimeInfo; im…

前端可观测性系统建设

一. 背景 随着前端业务的日趋庞大&#xff0c;及时发现和解决业务中的问题、优化用户体验、实时监控业务健康度变得愈发重要。在业务层面&#xff0c;我们希望能够监控每次发布版本后&#xff0c;核心功能是否有显著提升或至少没有负面影响&#xff0c;核心接口是否正常运作&a…

禁用/屏蔽 Chrome 默认快捷键

Chrome 有一些内置的快捷键&#xff0c;但是它并没有像其他软件一样提供管理快捷键的界面。在某些时候&#xff0c;当我们因为个人需求希望禁用 Chrome 某些快捷键时&#xff0c;又无从下手。 好在有开发者开发了 Chrome 插件&#xff0c;可以禁用 Chrome 快捷键的插件&#x…

振动分析-4-振动传感器的安装部署

参考(电机、减速机、风机)振动传感器部署指南 设备状态监测的测点通常选在设备轴承或靠近轴承的位置&#xff0c;通过在轴向、垂直方向、水平方向部署振动传感器来实现设备振动信号的采集。但在实际工作中&#xff0c;考虑安装空间和硬件成本&#xff0c;部署过程通常被两个问题…

使用Apache Flink实现实时数据同步与清洗:MySQL和Oracle到目标MySQL的ETL流程

使用Apache Flink实现实时数据同步与清洗&#xff1a;MySQL和Oracle到目标MySQL的ETL流程 实现数据同步的ETL&#xff08;抽取、转换、加载&#xff09;过程通常涉及从源系统&#xff08;如数据库、消息队列或文件&#xff09;中抽取数据&#xff0c;进行必要的转换&#xff0c…

基于VTK9.3.0+Visual Studio2017 c++实现DICOM影像MPR多平面重建

开源库&#xff1a;VTK9.3.0 开发工具&#xff1a;Visual Studio2017 开发语言&#xff1a;C 实现过程&#xff1a; void initImageActor(double* Matrix, double* center, vtkSmartPointer<vtkImageCast> pImageCast,vtkSmartPointer<vtkImageReslice> imageRe…

Python 库PySpark,一个超级强大的数据处理引擎

目录 01初识 PySpark 为什么选择 PySpark? 安装 PySpark 配置 PySpark 02基本操作 创建 RDD 基本 RDD 操作 03DataFrame 和 Spark SQL 创建 DataFrame 基本 DataFrame 操作 使用 Spark SQL 04机器学习与流处理 …

MacOS - 3 招快速去除桌面上的图标文件

在平时用 Mac 电脑的时候&#xff0c;会产生许多我们不用的或废弃的图标、文件&#xff0c;在 Mac 桌面上显得很乱&#xff0c;不仅影响美观也直接影响了我们工作的心情。下面我们分享 3 招快速去除桌面上的图标或文件的方法&#xff0c;有需要的朋友可以试一试。 1. 右键删除&…

QPushButton、QCheckBox、QRadioPutton、QLineEdit用法

实现LineEdit 文本的 居左、居中、居右设置 实现LineEdit 文本的粗体、斜体、下划线设置 实现LineEdit 控件的 ReadOnly、Enable、ClearButtonEnable的设置 创建资源文件&#xff0c;引入button需要的icon 总体布局 窗体使用垂直布局&#xff0c;每个组合控件内部是水平布局 2个…

游泳耳机品牌排行榜,10大实力超群的游泳耳机分享!

在当今快节奏的生活中&#xff0c;运动已成为许多人不可或缺的一部分&#xff0c;不仅为了健康&#xff0c;也是释放压力、提升生活品质的有效方式。而随着科技与健身的深度融合&#xff0c;智能穿戴设备尤其是专为运动设计的耳机&#xff0c;正逐渐成为运动爱好者的新宠。对于…

nodejs爬虫小红书评论区

发现好像还是爬虫的知识热度比较高&#xff0c;最近一直在加强JS这块。这两天脚本模拟爬BOSS的时候也想着怎么用nodejs&#xff0c;昨天都没更新文章&#xff0c;Q-Q&#xff0c;因为一直failed没啥成果。 使用模块 这边可以看到使用的模块其实也挺多&#xff0c;但主要还是ht…