当前位置: 首页 > ai >正文

Day05 单调栈 | 84. 柱状图中最大的矩形、42. 接雨水

一、84. 柱状图中最大的矩形
1、思路

单调递增,遇到低的矩形时,单调性破坏后,需要将栈里面的数据逐个出栈,宽度累加,然后计算面积,取最大值

2、代码
;
class Solution {public int largestRectangleArea(int[] heights) {// 单调递增,当单调性破坏后,需要将栈里面的数据逐个出栈,然后计算面积,取最大值// 2 入栈// 2 比 1 大,破坏单调递增,计算结果,出栈,栈空// 1入栈 5 入栈 6 入栈// 6比 2 大,破坏单调递增.计算结果出栈,结果比较大小,取大, 6出栈,宽度+1 , 5一样,依次出栈,宽度累加,取最大值,宽度+1// 1 比2 小 2入栈 ,同理,2 比 3小 ,3 入栈// 最后如果栈不为空,则计算栈里面面积最大数据Stack<Rect> stack = new Stack();int maxResult = 0;for (int h : heights) {int widthSum = 0;// 栈不为空并且栈顶(之前)高度大于等于当前高度,则计算栈里面面积最大数据while (!stack.empty() && stack.peek().getHeight() >= h) {Rect r = stack.pop();int a = r.getHeight(); // 栈顶高度widthSum += r.getWidth(); // 栈顶宽度 累加maxResult = Math.max(a * widthSum, maxResult);}Rect rect = new Rect(widthSum + 1, h);stack.push(rect);}int widthSum = 0;// 栈不为空,则计算栈里面面积最大数据while (!stack.empty()) {Rect r = stack.pop();int a = r.getHeight(); // 栈顶高度widthSum += r.getWidth(); // 栈顶宽度 累加maxResult = Math.max(a * widthSum, maxResult);}return maxResult;}
}class Rect {int width;int height;public Rect() {}public Rect(int width, int height) {this.width = width;this.height = height;}public int getWidth() {return width;}public int getHeight() {return height;}
}
二、42. 接雨水
1、思路

单调递减,遇到高的停止, 单调性破坏后,需要将栈里面的数据逐个出栈,宽度累加,然后计算面积,面积累加,注意边界,水流出

2、代码
class Solution {public int trap(int[] height) {// 单调递减,遇到高的停止,计算栈里面面积,累加宽度,出栈//2 1 0 1int maxResult = 0;Stack<Rect> stack = new Stack();for (int h : height) {int widthSum = 0;while (!stack.empty() && stack.peek().getHeight() < h) {Rect r = stack.pop();int width = r.getWidth();int h2 = r.getHeight();// 计算面积,宽度累加widthSum += width;// 如果弹一个后,栈为空,则水从左边流走了if(stack.empty()){continue;}maxResult += widthSum*(Math.min(h,stack.peek().getHeight()) - h2);}Rect rect = new Rect(widthSum + 1, h);stack.push(rect);}return maxResult;}}class Rect {int width;int height;public Rect() {}public Rect(int width, int height) {this.width = width;this.height = height;}public int getWidth() {return width;}public int getHeight() {return height;}
}
三、总结

单调栈题目思维模板:

  • 确定递增递减 --------关键在于考虑 前面不能影响后面 条件
  • 柱状图中最大的矩形题目中若 h[i-1] > h[i] ,则h[i-1] 这个高度就无法影响到更后面,自然可以单独计算

单调栈题目代码模板

  • for循环遍历每个元素
  • ​ while(栈顶与新元素不满足单调性){弹栈 ,更新答案,累加宽度}
  • ​ 入栈
http://www.xdnf.cn/news/20276.html

相关文章:

  • LeetCode算法日记 - Day 34: 二进制求和、字符串相乘
  • 【目录-多选】鸿蒙HarmonyOS开发者基础
  • 分布式go项目-搭建监控和追踪方案
  • 国内外支持个人开发者的应用市场
  • OpenCV - 图像的IO操作
  • 【开题答辩全过程】以 住院管理系统为例,包含答辩的问题和答案
  • 从零开始的python学习——文件
  • C++ 面向对象编程:多态相关面试简答题
  • 444444
  • LeetCode - 1089. 复写零
  • MQTT 与 Java 框架集成:Spring Boot 实战(三)
  • RAG提示词分解
  • CentOS系统管理:useradd命令的全面解析
  • Vllm-0.10.1:通过vllm bench serve测试TTFT、TPOT、ITL、E2EL四个指标
  • 多线程任务执行窗体框架jjychengTaskWinForm
  • 浅析Linux内核scatter-gather list实现
  • SQL 实战指南:电商订单数据分析(订单 / 用户 / 商品表关联 + 统计需求)
  • WordPress过滤文章插入链接rel属性noopener noreferrer值
  • 开源与定制化对比:哪种在线教育系统源码更适合教育培训APP开发?
  • 企业微信智能表格高效使用指南
  • Kafka Exactly-Once 语义深度解析与性能优化实践指南
  • 串口发送数据
  • 如何离线安装 VirtualMachinePlatform
  • 基于STM32单片机的家庭医护血氧体温血压吃药监测APP系统
  • 万字长文详解 MyCat 分表分库:从 0 到 1 构建高可用订单系统
  • 能发弹幕的简单视频网站
  • 计算机网络:调制解调器
  • Docker-volume数据卷
  • 为什么固态硬盘断电后数据还能保存不丢失?
  • 【LeetCode热题100道笔记】二叉树展开为链表