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

【LeetCode】【算法】42. 接雨水

LeetCode 42. 接雨水

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

思路

单调栈
首先考虑清楚存储雨水的必要条件是:后面的高度>前面的高度才有可能做雨水存储,所以这里最好可以用单调栈实现。
下面的单调栈中存储输入数组的下标,通过height[下标]就可以获得下标处高度:

  1. height[栈顶下标]>height[当前下标]时,将当前下标压入栈中(此时是后面的高度<前面的高度);
  2. height[栈顶下标]==height[当前下标]时,弹出栈顶下标,压入当前下标,虽然不弹出就压入也不影响计算,但是因为相同高度没法存水,可以通过这个操作避免重复计算
  3. height[栈顶下标]<height[当前下标]时,就到了计算存水面积的时候了,这里需要不断弹出那些小的元素。那么,储水高度height=Math.min(height[栈顶下标的left],height[栈顶下标的right])-height[栈顶下标] ,就相当于把栈顶的高度作为底,左右围在一起形成一个容器。储水宽度width=栈顶下标的right-栈顶下标的left-1。最终面积sum+=h*w

代码

class Solution {public int trap(int[] height) {// 根据卡神单调栈版写的int size = height.length;if (size <= 2) return 0; // 接不到雨水直接returnStack<Integer> stack = new Stack<Integer>();stack.push(0);int sum = 0;for (int i = 1; i < height.length; i++) {int stackTop = stack.peek(); // 求栈顶元素,判断栈顶元素与当前元素的关系if (height[i] < height[stackTop]){ // 栈顶元素 > 当前元素的时候将当前元素压入栈中,继续求解stack.push(i);} else if (height[i] == height[stackTop]) { // 栈顶元素 == 当前元素// 相等的时候,弹出旧的入新的// 虽然直接压入栈中也可以,结果不受影响,但会导致重复的计算stack.pop();stack.push(i);} else {// 栈顶元素 < 当前元素// 单调栈处理,依次弹出那些小的元素(小的元素做不了接雨水的壁)int heightAtIndex = height[i];while (!stack.isEmpty() && heightAtIndex > height[stackTop]){int mid = stack.pop();if (!stack.isEmpty()){int left = stack.peek();int h = Math.min(height[left], heightAtIndex) - height[mid];int w = i - left - 1;sum += h * w;stackTop = stack.peek();}}stack.push(i);}}return sum;}
}
http://www.lryc.cn/news/482258.html

相关文章:

  • 深⼊理解指针(5)[回调函数、qsort相关知识(qsort可用于各种类型变量的排序)】
  • qt QRunnable 与 QThreadPool详解
  • 博客摘录「 java三年工作经验面试题整理《精华》」2023年6月12日
  • 福禄克FLUKE5500A与fluke5520a校准仪的区别功能
  • 量化交易系统开发-实时行情自动化交易-2.技术栈
  • 【逆向爬虫实战】--全方位分析+某某学堂登录(DES加密)
  • 第2关:装载问题 (最优队列法)
  • 萤石设备视频接入平台EasyCVR海康私有化视频平台监控硬盘和普通硬盘有何区别?
  • 【Webpack配置全解析】打造你的专属构建流程️(4)
  • 【SpringMVC】基础入门(1)
  • FFmpeg存放压缩后的音视频数据的结构体:AVPacket简介,结构体,函数
  • 用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(三)
  • #渗透测试#SRC漏洞挖掘#深入挖掘CSRF漏洞02
  • 基于OpenCV的相机捕捉视频进行人脸检测--米尔NXP i.MX93开发板
  • 【Node-Red】使用文件或相机拍摄实现图像识别
  • 【Arcpy】提示需要深度学习框架代码
  • 【蓝桥杯 2021 省 B2】特殊年份
  • 【云原生开发】namespace管理的后端开发设计与实现
  • 威联通Docker Compose搭建NAS媒体库资源工具NAS Tools
  • 【JAVA基础】MAVEN的安装及idea的引用说明
  • 【go从零单排】Rate Limiting限流
  • 解析Eureka的架构
  • AI变现,做数字游民
  • linux-vlan
  • 前端跨域~简述
  • GIN:逼近WL-test的GNN架构
  • NIST密码学未来展望:Naughty Step 上的 SHA-1、3DES 和 SHA-224
  • go 集成gorm 数据库操作
  • 进程 线程 和go协程的区别
  • STM32获取SHT3X温湿度芯片数据