算法 DAY59 单调栈2 503.下一个更大元素II 42. 接雨水 84.柱状图中最大的矩形

news2024/11/25 4:03:36

503.下一个更大元素II

难点在于如何是实现数组的循环
在这里插入图片描述但使用模拟遍历两次的时候注意始终使用index,别出现越界

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        stack<int> st;
        st.push(0);
        vector<int> res(nums.size(),-1);
        
        for(int i = 0; i < nums.size()*2;i++){
            int index = i % nums.size();
            while(!st.empty() && nums[index] > nums[st.top()]){
                res[st.top()] =  nums[index];
                st.pop();
            }
            st.push(index);
        }
        return res;
    }
};

42. 接雨水

本题首先要明确:按行统计还是按照列统计。
核心思想:按列统计,找到每一列左右两侧的最大值,取其中最小值,减去当前值就是这一列的雨水。其中第一根柱子和最后一根不做统计。
例如求列4的雨水高度:
在这里插入图片描述列4 = min(2 , 3) - 1 = 1

1、暴力解法

那么暴力解法就是遍历数组,同时嵌套for寻找两边的最大值,这样时间复杂度就是O(n2),超时

2、双指针优化
但其实没必要嵌套for数组,直接用数组遍历两边,每个列左边最大值记录在maxLeft数组,右边记录在maxRight数组就行。最后再遍历原始数组。

class Solution {
public:
    int trap(vector<int>& height) {
        vector<int> maxLeft(height.size(),0);
        vector<int> maxRight(height.size(),0);
        maxLeft[0] = height[0];
        for(int i = 1; i < height.size();++i){
            maxLeft[i] = max(height[i],maxLeft[i-1]);
        }
        maxRight[height.size()-1] = height[height.size()-1];
        for(int i = height.size()-2;i>=0;i--){
            maxRight[i] = max(maxRight[i+1],height[i]);
        }

        int sum = 0;
        for(int i = 1;i<height.size()-1;++i){
            int temp = min(maxLeft[i-1],maxRight[i+1]) - height[i];
            if(temp>0) sum+= temp;
        }
        return sum;
    }
};

3、单调栈解法
单调栈是按照行方向来计算雨水
在这里插入图片描述
一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。
在这里插入图片描述
在这里插入图片描述

情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()] 直接push
情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()] 替换下标
情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()] 利用左中右三个元素来求雨水

class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> st;
        st.push(0);
        int sum = 0;
        for(int i = 1; i < height.size();++i){
            while(!st.empty() && height[i] > height[st.top()]){
                int mid = st.top();
                st.pop();
                if(!st.empty()){
                    int h = min(height[st.top()],height[i])-height[mid];
                    int w = i-st.top()-1;
                    sum += h*w;
                }
            }
            st.push(i);
        }
        return sum;
    }
};

84.柱状图中最大的矩形

跟接雨水相似,但是又不同。42. 接雨水 (opens new window)是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。
在这里插入图片描述只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> st;
        heights.insert(heights.begin(), 0); // 数组头部加入元素0
        heights.push_back(0); // 数组尾部加入元素0
        st.push(0);
        int result = 0;
        for (int i = 1; i < heights.size(); i++) {
            while (heights[i] < heights[st.top()]) {
                int mid = st.top();
                st.pop();
                int w = i - st.top() - 1;
                int h = heights[mid];
                result = max(result, w * h);
            }
            st.push(i);
        }
        return result;
    }
};

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

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

相关文章

图和简单图

图的定义 一个图G定义为一个有序对&#xff08;V,E&#xff09;&#xff0c;记为V&#xff08;V,E&#xff09;&#xff0c;其中 V是一个非空集合&#xff0c;称为顶点集或点集&#xff0c;其元素称为顶点或点。E是由V中的点组成的无序点对构成的集合&#xff0c;称为边集&am…

.NET开发问题记录——TransactionScope出错:“与基础事务管理器的通信失败”的解决方法

文章目录 前言问题产生使用TransactionScope进行事务控制 分布式事务&#xff08;Distributed Transaction Coordinator&#xff09;未开启原因该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 System.Transactions.TransactionManagerCommunicationException: 与基础事务…

Reference Doc

场景&#xff1a; reference doc 是springboot官方文档

【C++入门编程常见问题】(小白必看)

常见问题 vsstudio快捷键 快速注释组合键 ctrlk ctrlc 取消注释快捷键 ctrlk ctrl u 支持垃圾回收机制 大多数面向对象编程语言具有垃圾回收机制。早期的C语言不具备垃圾回收机制&#xff0c;这意味着申请的内存资源在使用完成后&#xff0c;需要程序员自己释放。直到C11标…

springcloud-alibaba (01)linux下Nacos单节点安装和部署

Nacos 一&#xff0c;下载解压 Nacos二&#xff0c;使用外部存储器&#xff08;可选&#xff09;三&#xff0c;Nacos配置四&#xff0c;防火墙配置五&#xff0c;启动nacos 一&#xff0c;下载解压 Nacos 首先确保你的系统上已经安装了 Java&#xff0c;可以运行以下命令检查&…

B站C语言学习,颠覆谭浩强C语言,可能是最好的C语言视频 【自用笔记】

文章目录 数据类型字符&#xff0c;整型&#xff0c;浮点型sizeof 展示字节大小 变量 常量变量变量&#xff1a;全局变量 /局部变量变量的使用变量的作用域和生命周期 常量const修饰的常变量#define定义的标识符常量枚举常量 数据类型字符&#xff0c;整型&#xff0c;浮点型si…

[LitCTF 2023] crypto,pwn,rev

这个比赛有巨多的题&#xff0c;而且基本上都很简单&#xff0c;队里答疯了。其实没大意思&#xff0c;本来不想写了&#xff0c;可又没啥可写&#xff0c;这周也就干点这个&#xff0c;算是放松吧。 Crypto 1,HEX 略 2,梦想是红色的&#xff0c;略 3&#xff0c;原来你也玩…

es7.x 通过java api实现常规操作

一 es7.x 1.1 配置pom文件 <dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</version></dependency><!-- elasticsearch的客户端 -->&…

Springboot启动失败 DB连不上竟然是maven配置的问题

Springboot启动失败&#xff1a;Failed to instantiate [javax.sql.DataSource]。 最开始以为是DB版本后&#xff0c;需要升级驱动版本&#xff0c;但更新驱动版本还是不行&#xff0c;而且另外一个项目同样驱动同样配置可以启动。 后面发现代码读取不到yml文件中的配置信息。…

zigbee MQTT控制小米蓝牙插座开和关 型号Xiao Mi zigbee ZNCZ02LM 或支持zigbee的插座或设备

zigbee MQTT控制小米蓝牙插座开和关 型号Xiao Mi zigbee ZNCZ02LM 或支持zigbee的插座或设备 硬件准备 小米蓝牙插座&#xff0c;型号: Xiao Mi zigbee ZNCZ02LM 或支持zigbee的插座或设备 zigbee设备&#xff0c;型号: CC2531设备 参考链接: https://github.com/Koenkk/zi…

Linux高并发服务器开发01:Linux系统编程入门

GCC 什么是GCC GCC工作流程 GCC常用的参数选项 GCC和G的区别 静态库 什么是库 静态库的制作 先编译生成对应的.o文件 gcc -c add.c sub.c mult.c div.c -I …/include/ 再将.o文件打包成静态库 ar rcs libcalc.a add.o sub.o mult.o div.o 使用的时候-l指定库名称 gcc main.c…

[C++]AVL树、红黑树以及map、set封装

目录 前言&#xff1a; 1 AVL树 1.1 AVL树的概念 1.2 AVL树结点的定义 1.3 AVL树插入 1.4 插入结点的调整 1.5 AVL树的旋转调整 1.5.1 右单旋 1.5.2 左单旋 1.5.3 左右双旋 1.5.4 右左双旋 1.5.4种旋转的判断方式 2 红黑树 2.1 红黑树概念 2.2 红黑树与AVL树的比…

路径规划算法:基于飞蛾扑火算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于飞蛾扑火优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于飞蛾扑火优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

Linux基本指令-3

文章目录 一、 d a t e date date [选项] 格式1、常用选项&#xff1a;2、运用实例&#xff1a; 二、 c a l cal cal [选项] [年份]1、常用选项&#xff1a;2、运用实例&#xff1a; 三、 f i n d find find[路径] [ − n a m e ] [-name] [−name] 文件名1、…

消息推送平台有没有保证数据不丢?

我们在使用mq的时候&#xff0c;就会很自然思考一个问题&#xff1a;怎么保证数据不丢失&#xff1f; 现在austin接入层是把消息发到mq&#xff0c;下发逻辑层从mq消费数据&#xff0c;随后调用对应渠道接口来下发消息。 消息推送平台&#x1f525;推送下发【邮件】【短信】【…

001 - STM32固件库编程

STM32固件库编程 一、新建工程文件夹 1、工程文件夹内添加&#xff1a;Project、Libraries、User、Doc&#xff0c;之后在Project目录内新建工程&#xff0c;并将标准库中CMSIS、STM32F4xx_StdPeriph_Driver复制到Libraries中。 2、将\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Pr…

Hbase基础介绍-1 概述

Hbase基础介绍-1 概述 一、概述1、定义&#xff1a;2、特点&#xff1a;3、HBase在Hadoop生态中的地位4、HBase与HDFS5、Hbase与Hive6、关系型数据库与列式数据库7、结构化数据和非结构化数据8、HBase使用场景9、CAP定理10、Hbase与传统关系型数据库的区别 一、概述 1、定义&am…

飞腾D2000 如何修改boot启动项

开机后,按着F2进入如下界面 选择Enter Setup 选择 Boot Maintenance Manager 进入Boot Options 选择Change Boot Order 在这个界面按 键盘上的 Enter 键 在弹出得蓝色小方框里,按键盘的上下键,比如我要把硬盘盘符放在boot 启动项的第一首选项,则移动下键到硬盘盘符上,再…

嵌入式系统入门基础知识分析(二)

目录 ​编辑 1、GPIO原理与结构 2、A/D接口 3、D/A接口基本 4、键盘接口

解密网站401错误:了解发生原因和修复方法

​  每个网站都会有不同的错误码&#xff0c;其中&#xff0c;401错误被认为是相对常见的错误码。那么&#xff0c;什么是网站401错误呢?在摸清了这一点之后&#xff0c;我们也需要学习一下如何解决它。 什么是 401 状态码? 401 状态代码是 Web 服务器发送给浏览器的 HTTP …