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

[豪の算法奇妙冒险] 代码随想录算法训练营第四十九天 | 42-接雨水、84-柱状图中最大的矩形

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


LeetCode42 接雨水

题目链接:https://leetcode.cn/problems/trapping-rain-water/description/

文章讲解:https://programmercarl.com/0042.接雨水.html

视频讲解:https://www.bilibili.com/video/BV1uD4y1u75P/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 单调栈思路,按行计算雨水,横向求解

​ 找凹槽就是求左右第一个更大的元素,单调栈从栈头到栈底是递增。一旦发现添加的柱子高度大于栈头元素,此时就发现了凹槽,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,添加的柱子就是凹槽右边的柱子

​ 遇到相同高度的元素,将栈里元素(旧下标)弹出,再将新元素(新下标)加入栈中,因为后续求宽度时,遇到相同高度的柱子,要使用最右边的柱子来计算宽度

​ 另外注意不要操作空栈导致空指针异常

image-20260228204837726

class Solution {public int trap(int[] height) {int totalRain = 0;Deque<Integer> stack = new LinkedList<>();stack.push(0);for(int i = 1; i < height.length; i++){if(height[i] < height[stack.peek()]){stack.push(i);}else if(height[i] == height[stack.peek()]){stack.pop();stack.push(i);}else{while(!stack.isEmpty() && height[i] > height[stack.peek()]){int mid = stack.pop();if(!stack.isEmpty()){int h = Math.min(height[stack.peek()], height[i]) - height[mid];int width = i - stack.peek() - 1;totalRain += h*width;}}stack.push(i);}}return totalRain;}
}

​ 精简版代码:

image-20260228203337764

class Solution {public int trap(int[] height) {int totalRain = 0;Deque<Integer> stack = new LinkedList<>();for(int i = 0; i < height.length; i++){while(!stack.isEmpty() && height[i] > height[stack.peek()]){int mid = stack.pop();if(!stack.isEmpty()){int h = Math.min(height[stack.peek()], height[i]) - height[mid];int width = i - stack.peek() - 1;totalRain += width*h;}}stack.push(i);}return totalRain;}
}

LeetCode84 柱状图中最大的矩形

题目链接:https://leetcode.cn/problems/largest-rectangle-in-histogram/description/

文章讲解:https://programmercarl.com/0084.柱状图中最大的矩形.html

视频讲解:https://www.bilibili.com/video/BV1Ns4y1o7uB/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 本题与LeetCode42 接雨水时相呼应的两道题,接雨水是找左右两边第一个大于该柱子高度的柱子,而本题是找左右第一个小于该柱子的柱子

​ 找左右第一个更小的元素,单调栈从栈顶到栈底递减。栈顶和栈顶的下一个元素以及要入栈的三个元素组成了要求的最大面积的高度和宽度

​ heights数组末尾要加零,是因为如果数组本身升序,入栈后一定都是单调递减,一直没有计算结果,结尾加个0就会让栈内所有元素进入计算结果的情况

​ heights数组开头也要加0,是因为如果数组本身降序,例如[8,6,4,2],在8入栈后,6开始与8比较,此时得到mid(8),right(6),但是得不到left。因为此时把mid(8)弹出了,栈内没有元素,为了避免空栈取值会跳过计算结果的逻辑,之后又将6入栈,周而复始

image-20260228213534677

class Solution {public int largestRectangleArea(int[] heights) {int[] newHeights = new int[heights.length+2];newHeights[0] = 0;newHeights[heights.length+1] = 0;for(int i = 0; i < heights.length; i++){newHeights[i+1] = heights[i];}Deque<Integer> stack = new LinkedList<>();int maxArea = 0;stack.push(0);for(int i = 1; i < newHeights.length; i++){if(newHeights[i] > newHeights[stack.peek()]){stack.push(i);}else if(newHeights[i] == newHeights[stack.peek()]){stack.pop();stack.push(i);}else{while(!stack.isEmpty() && newHeights[i] < newHeights[stack.peek()]){int mid = stack.pop();if(!stack.isEmpty()){int h = newHeights[mid];int width = i - stack.peek() - 1;maxArea = Math.max(maxArea, h*width);}}stack.push(i);}}return maxArea;}
}
http://www.jsqmd.com/news/422051/

相关文章:

  • 600018的753分析
  • 大数据情感分析:如何利用情感数据优化供应链管理?
  • 京城亚南酒业:北京上门收酒老字号,藏家公认放心选择 - 品牌排行榜单
  • 包管理工具
  • 北京整箱酒上门回收|原件茅台、原件五粮液、整箱老酒,上门搬运更省心 - 品牌排行榜单
  • 北京礼品酒上门回收|节日闲置、商务礼品、未拆封名酒,上门快速变现 - 品牌排行榜单
  • 北京高端名酒上门回收|收藏级酒品变现,专业、保密、高价 - 品牌排行榜单
  • 北京上门收酒全攻略:藏家必看,避免压价、调包、套路 - 品牌排行榜单
  • 北京洋酒红酒上门回收|路易十三、轩尼诗、麦卡伦、罗曼尼康帝,专业上门收 - 品牌排行榜单
  • [gitflow]
  • 北京上门收酒哪家靠谱?藏家真实体验:找对人,省心又安心 - 品牌排行榜单
  • 让Agent越来越懂你:长期记忆的原理与工程实现
  • Unity3D 快抢红包互动小游戏
  • 【计算机毕业设计案例】基于大数据的全国降水分析可视化系统基于springboot全国降水分析可视化系统的设计与实现(程序+文档+讲解+定制)
  • 2026 气浮机十大品牌排行榜|权威推荐优质气浮机生产厂家 - 品牌推荐大师1
  • 【计算机毕业设计案例】基于Hadoop+springboot的宁波旅游推荐周边商城实现与设计(程序+文档+讲解+定制)
  • day99(2.28)——leetcode面试经典150
  • P3700 [CQOI2017] 小 Q 的表格 题解
  • LLM学习笔记 - yi
  • 惊!这个方法让我一秒在百度网盘下完10GB文件!!
  • 基于python的互联网+志愿服务求职招聘系统(源码+文档)
  • 滑动窗口-02-找到字符串中所有字母异位词
  • 大数据毕设项目推荐-基于Django的B站数据分析可视化系统【附源码+文档,调试定制服务】
  • 【计算机毕业设计案例】基于Hadoop+springboot的个性化饮食推荐健康饮食推荐系统的设计与实现(程序+文档+讲解+定制)
  • C#程序启动报错“System.TypeInitializationException:“The type initializer for ...”
  • 【计算机毕业设计案例】基于Django的B站数据分析可视化系统(程序+文档+讲解+定制)
  • 学习C#调用Microsoft.ML.OnnxRuntime模块读取YOLO模型信息
  • 解决java文件无法写入安卓dex文件中的问题。
  • 市面上有实力的2025板材工厂 - 品牌推荐(官方)
  • 三菱伺服编码器驱动的追剪案例:8轴运动控制下的高级同步控制与凸轮同步技术