笔记:代码随想录算法训练营day55:LeetCode42. 接雨水、84.柱状图中最大的矩形

server/2025/3/18 16:21:07/

学习资料:代码随想录

42. 接雨水

力扣题目链接

暴力解法超时了,直接从双指针开始

双指大概思路为创立两个数组记录两侧的最大值,这里的最大值是真正的最大的值,而不是最近的那个比较大的值,即所谓的按列计算,后面单调栈方法找到的是上一个较大值和下一个较大值,是所谓的按行计算,这样这个凹槽可能身处更大的凹槽中,所以每次都要乘一个宽度,类似与按层往上摞

class Solution {
public:int trap(vector<int>& height) {vector<int> Rightmax(height.size(),0);       //牺牲一点空间复杂度换时间复杂度vector<int> Leftmax(height.size(),0);int size=height.size();Leftmax[0]=height[0];Rightmax[size-1]=height[size-1];for(int i=1;i<size;i++){Leftmax[i]=max(Leftmax[i-1],height[i]);}for(int j=size-2;j>=0;j--){Rightmax[j]=max(Rightmax[j+1],height[j]);}int sum = 0;for(int i=1;i<size-1;i++){int capacity=min(Leftmax[i],Rightmax[i])-height[i];if(capacity>0) sum+=capacity;}return sum;}
};

单调栈:遇到比栈顶小的值和等于的值就入栈,相当于等待那个大的出现,如次栈顶的下一个下标对应的值比它大,再遇到大的,正好栈顶元素的两边会比其大

要注意警惕对栈非空的判断,否则超时很难排查

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++){if(height[i]<height[st.top()]){st.push(i);}else if(height[i]==height[st.top()]){st.push(i);} else{while(!st.empty()&&height[i]>height[st.top()]){int cur = st.top();st.pop();if(!st.empty()){        //这里还要检查一下防止访问空int h =min(height[i],height[st.top()])-height[cur];int w=i-st.top()-1;int capacity = h*w;sum+=capacity;}}st.push(i);}}return sum;}
};

84.柱状图中最大的矩形

力扣题目链接

先看单调栈的方法:首先要理解求这个面积的方法是当前的值为高,宽为左边比其小到右边比其小的这个距离,高乘宽为能勾勒的最大矩形的面积

这次是找两边的小值,逻辑上是接雨水变一下操作逻辑,当前大于等于栈顶的情况入栈,等那个小的,这样栈顶两侧都比其小

尾加一个0是为了数组最后是升序的情况下,让数组到最后能找到那个小的,进行计算逻辑。最后这个0会被放在栈里,不会影响结果

开头加一个0是为了在数组降序的情况下,能找到那个小的,能进行正常的计算逻辑

class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> st;st.push(0);heights.insert(heights.begin(),0);heights.insert(heights.end(),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.push(i);}else{while(!st.empty()&&heights[i]<heights[st.top()]){int cur = st.top();st.pop();if(!st.empty()){int left = st.top();int right = i;int h=heights[cur];int width = i-st.top()-1;result = max(result,h*width);}}st.push(i);}}return result;}
};

这次双指针也是记录的下标了,而且和上一题不同的一个地方是,不是找两侧的最小的,而是找到第一个比其小的就停

// leftMinIndex[i]表示i处左边的较小高度柱子的高度的下标
class Solution {
public:int largestRectangleArea(vector<int>& heights) {vector<int> leftMinIndex(heights.size());vector<int> rightMinIndex(heights.size());int result =0;leftMinIndex[0] = -1;    //初始化防止死循环for(int i=1;i<heights.size();i++){int t=i-1;while(t>=0&&heights[t]>=heights[i]){t=leftMinIndex[t];               //有回溯的感觉了}leftMinIndex[i]=t;}rightMinIndex[heights.size()-1] = heights.size(); //初始化防止死循环for(int j=heights.size()-2;j>=0;j--){int t=j+1;while(t<heights.size()&&heights[t]>=heights[j]){t=rightMinIndex[t];}rightMinIndex[j]=t;}for(int i=0;i<heights.size();i++){int area = heights[i]*(rightMinIndex[i]-leftMinIndex[i]-1);result=max(area,result);}return result;}
};


http://www.ppmy.cn/server/176000.html

相关文章

visual studio code C++开发基础配置

1、下载安装 Visual Studio Code - Code Editing. Redefined 安装完成后打开vscode&#xff0c;点击红色圈出区域&#xff0c;在搜索框分别搜索“C/C”以及“chinese”&#xff0c;安装C/C插件(必须有)与简体中文插件 2、安装MinGW-w64 从清华大学镜像下载网速更快更稳定 ms…

二、vtkCommand的使用

一、概述 vtkCommand是VTK中的一个重要的类&#xff0c;用于处理事件和回调机制。它允许用户在特定事件发生时执行自定义的操作&#xff0c;例如在交互操作、数据更新或渲染过程中触发某些功能。 二、主要功能 1、事件处理&#xff1a;vtkCommand用于监听和处理VTK管线中的各…

Python学习第十八天

Django模型 定义&#xff1a;模型是 Django 中用于定义数据库结构的 Python 类。每个模型类对应数据库中的一张表&#xff0c;类的属性对应表的字段。 作用&#xff1a;通过模型&#xff0c;Django 可以将 Python 代码与数据库表结构关联起来&#xff0c;开发者无需直接编写 S…

网页制作代码html制作一个网页模板

制作一个简单而实用的网页模板&#xff1a;HTML基础入门 在数字时代&#xff0c;网页已成为信息展示和交流的重要平台。HTML&#xff08;HyperText Markup Language&#xff09;作为网页制作的基础语言&#xff0c;为开发者提供了构建网页的基本框架。本文将带你了解如何使用H…

【Spring】第二弹:通过反射机制初步理解 IoC

一、Java 反射机制 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机…

Ubuntu 常用指令手册

&#x1f4c1; 文件/目录操作 1. 基础操作 # 递归复制目录&#xff08;含子目录&#xff09; cp -r source_dir/ target_dir/# 递归删除目录&#xff08;强制删除不提示&#xff09; rm -rf dir_name/# 查看当前路径 pwd# 创建多级目录 mkdir -p parent_dir/child_dir2. 权限…

正则表达式小结

正则表达式是一种用于描述文本模式的特殊字符串&#xff0c;它由一系列字符和特殊字符组成&#xff0c;用于匹配和操作文本数据。下面是正则表达式的一些常见规则&#xff1a; 字符匹配&#xff1a; 普通字符&#xff1a;正则表达式中的普通字符&#xff08;字母、数字、符号&a…

vue-router实现

实现一个简化版的 vue-router 可以帮助我们更好地理解 Vue 路由是如何工作的。Vue Router 主要的功能是基于浏览器的 URL 来管理组件的显示&#xff0c;能够根据 URL 变化切换不同的视图。下面是一个简化版的实现&#xff0c;用于帮助你理解基本的路由机制。 创建一个简单的 V…