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

devtools/2024/11/14 3:15: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.ppmy.cn/devtools/133465.html

相关文章

【Vue3】知识汇总,附详细定义和源码详解,后续出微信小程序项目(2)

快速跳转&#xff1a; 我的个人博客主页&#x1f449;&#xff1a;Reuuse博客 新开专栏&#x1f449;&#xff1a;Vue3专栏 参考文献&#x1f449;&#xff1a;uniapp官网 ❀ 感谢支持&#xff01;☀ 前情提要 &#x1f53a;因为最近学习的vue语言&#xff0c;发现有很多细节…

vscode使用之vscode-server离线安装

最近因为想要使用AI工具开始使用vscode&#xff0c;但是在内网使用vscode通过SSH连接虚拟机的centos远程目录却出现了问题&#xff0c;始终连不上&#xff0c;查看原因是centos没有安装vscode-server&#xff0c;网上找各个教程离线安装vscode-code除了浪费时间没有任何收获&am…

Redis下载历史版本

Linux版本&#xff1a; https://download.redis.io/releases/ Windows版本&#xff1a; https://github.com/tporadowski/redis/releases Linux Redis对应gcc版本

湾区聚力 开源启智 | 2024 CCF中国开源大会暨第五届OpenI/O启智开发者大会闪耀深圳

当下&#xff0c;全球数字化浪潮席卷而来&#xff0c;开源技术已成为科技创新和产业升级的关键驱动力。11月9-10日&#xff0c;以“湾区聚力 开源启智”为主题的2024 CCF中国开源大会在深圳隆重举行。本届大会由中国计算机学会主办&#xff0c;CCF开源发展委员会、鹏城实验室、…

使用概率表示和原型学习的有效半监督医学图像分割|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 Effective Semi-Supervised Medical ImageSegmentation with Probabilistic Representations and Prototype Learning 使用概率表示和原型学习的有效半监督医学图像分割 01 文献速递介绍 尽管基于深度学习的方法在有监督的医学图像分割任务中取得了巨大成功&am…

《NPU、CPU、GPU 算力定义和计算方式》

一、引言 在人工智能时代&#xff0c;算力成为了推动技术发展的关键因素之一。不同类型的处理器&#xff0c;如中央处理器&#xff08;CPU&#xff09;、图形处理器&#xff08;GPU&#xff09;和神经网络处理器&#xff08;NPU&#xff09;&#xff0c;在算力方面有着各自的特…

MinGW,cygw,GCC,arm-linux-gnueabihf-gcc 这几个有啥区别和联系

MinGW&#xff08;Minimalist GNU for Windows&#xff09; 目的与解决的问题&#xff1a; MinGW 是一个为 Windows 提供的 轻量级 的 GNU 工具链&#xff0c;包含了 GCC 编译器、链接器、汇编器等工具&#xff0c;可以在 Windows 环境下编译 C、C 等程序。 主要目标&#xff…

Linux的文件系统组成

Linux文件系统的组成和基础架构主要包括以下几个部分&#xff1a; 超级块&#xff08;Superblock&#xff09;&#xff1a; 超级块是文件系统的重要结构&#xff0c;包含了关于文件系统的元数据&#xff0c;如文件系统的类型、大小、空闲空间数量、inode信息等。 inode&#x…