力扣(leetcode) 407. 接雨水 II 3D接雨水

力扣(leetcode) 407. 接雨水 II 3D接雨水

给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。

示例 1:

请添加图片描述

输入: heightMap = [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]]
输出: 4
解释: 下雨后,雨水将会被上图蓝色的方块中。总的接雨水量为1+2+1=4。

示例 2:

请添加图片描述

输入: heightMap = [[3,3,3,3,3],[3,2,2,2,3],[3,2,1,2,3],[3,2,2,2,3],[3,3,3,3,3]]
输出: 10

提示:

  • m == heightMap.length
  • n == heightMap[i].length
  • 1 <= m, n <= 200
  • 0 <= heightMap[i][j] <= 2 * 10^4

思路:

这道题的思路可以延续二维接雨水问题的思路,二维的情况下,我们用双指针的方法不断的缩小未被扫描到的范围,也就是被我们(用指针)划定的边界框起来的范围。在范围缩小的过程中,可以不断的得到一个新的确定接水量的柱子。

那么在三维的情况下,也可以延续这个思想。在三维中,边界的划定不再是两个指针(或者说两根柱子),而是用一圈柱子。为什么是这样呢?因为我们可以发现,最周围一圈的柱子肯定是无法接水的,那么它们就形成了初始的围栏(边界)。我们知道一个道理“木桶装水的多少取决于最短的那块板的高度”,这里也是这样,我们找到最短的那个围栏(柱子),它必然可以确定与它相邻的柱子的接水量。

怎么确定的呢?我们看下面这张图片:

请添加图片描述

图中,蓝色的围栏中,高度为4的柱子为最短的。那么,与他相邻的柱子(图中以红色显示),如果高度高于4,则该柱子无法接水(水会从4那里漏出去)。如果高度低于4,那么我们可以确定红色柱子接水后 柱子加上水 最高高度为4。那最低高度呢?最低高度就得看它高度为4的水会不会流出去,而由于围栏最低高度都为4了,那么高度为4的水是无法通过围栏的,所以其最低高度也为4。也就是说,红色区域接水后的高度就等于4。(或者说高度已经被最短的那块围栏确定了)

利用最短围栏确定其领域接水高度的规则,我们可以依次确定红色区域的接水高度,然后将其加入到围栏当中,一直缩小围栏,就可以得到所有柱子的接水高度。

代码:

typedef pair<int,int> P;
class Solution {
public:int trapRainWater(vector<vector<int>>& height) {int m=height.size(),n=height[0].size();int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};vector<vector<bool> > vis(m,vector<bool>(n,false));priority_queue<P,vector<P>,greater<P> > que;for(int i=0;i<m;i++)for(int j=0;j<n;j++)if(i==0||j==0||i==m-1||j==n-1){que.push(make_pair(height[i][j],i*n+j));vis[i][j]=true;}int total=0;while(!que.empty()){P cur=que.top();que.pop();for(int i=0;i<4;i++){int x=cur.second/n,y=cur.second%n;int nx=x+dir[i][0],ny=y+dir[i][1];if(nx>=0&&nx<m&&ny>=0&&ny<n&&!vis[nx][ny]){if(height[nx][ny]<cur.first)total+=cur.first-height[nx][ny];vis[nx][ny]=true;que.push(make_pair(max(cur.first,height[nx][ny]),nx*n+ny));}}}return total;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640541.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt】:界面优化(二:控件样式)

界面优化 一.按钮二.复选框三.输入框四.列表五.菜单栏六.登陆界面七.小结 一.按钮 二.复选框 单选框的属性与复选框一样&#xff0c;就不多演示了。 三.输入框 四.列表 关于qlineargradient&#xff1a; qlineargradient有6个参数.x1, y1:标注了一个起点.x2, y2:标注了一个终点…

【Hadoop】-Apache Hive概述 Hive架构[11]

目录 Apache Hive概述 一、分布式SQL计算-Hive 二、为什么使用Hive Hive架构 一、Hive组件 Apache Hive概述 Apache Hive是一个在Hadoop上构建的数据仓库基础设施&#xff0c;它提供了一个SQL-Like查询语言来分析和查询大规模的数据集。Hive将结构化查询语言&#xff08;…

编写一款2D CAD/CAM软件(十六)交互绘制图形

绘制步骤 以交互绘制圆形为例&#xff1a; 点击鼠标左键&#xff0c;确定圆心位置&#xff1b;抬起鼠标&#xff0c;移动鼠标&#xff0c;半径随鼠标位置变化&#xff1b;点击左键确定半径&#xff0c;完成圆的绘制。 绘制结果 Code /// j-operator-create-circle.h#pragma…

自定义表单系统开源是否好用?

在竞争激烈的社会中&#xff0c;拥有够灵活、易维护、可视化界面等优势特点的低代码技术平台获得了很多中小型企业的认可与信赖。在提升企业竞争力、办公效率和规避信息孤岛等方面具有重要的应用价值和作用。流程信息为客户提供低代码技术平台、自定义表单系统开源&#xff0c;…

Android驱动开发之如何编译和更换内核

编译内核可以使用图形化的界面配置,也可以直接使用脚本。在X86_64模拟器环境下,不用交叉编译,而交叉编译工具很容易出现兼容问题,一般也只能使用芯片厂商提供的工具,而不是GNU提供的工具。 android内核开发流程以及架构变化了很多,详情请看 内核官网 内核版本选择 由…

去雾笔记-Pixel Shuffle,逆Pixel Shuffle,棋盘效应,转置卷积

文章目录 1.Pixel Shuffle2.Inverse Pixel Shuffle3.棋盘效应4.转置卷积5.宽激活块6.PSPNet7.反射填充层&#xff08;Reflective Padding Layer&#xff09;8.tanh层 1.Pixel Shuffle Pixel Shuffle是一种用于图像超分辨率的技术&#xff0c;它通过重新排列图像的像素来增加图…

Windows 安全中心:页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问,并且你尝试访问的项目不可用。有关详细信息,请与 IT 支持人员联系。

问题 1&#xff1a;Windows 安全中心提示&#xff1a;【页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问&#xff0c;并且你尝试访问的项目不可用。有关详细信息&#xff0c;请与 IT 支持人员联系。】 修复 Microsoft.SecHealthUI 方法 1&#xff1a;命令自动重装安…

Hive架构原理

Hive Hive 的架构是设计用于在大数据环境下进行数据仓库操作和分析的系统。它建立在 Hadoop 生态系统之上&#xff0c;利用 Hadoop 的存储&#xff08;HDFS&#xff09;和计算&#xff08;MapReduce、Tez、Spark 等&#xff09;能力。 1. 元数据存储&#xff08;Metastore&am…

Linux(centos)服务器10秒快速配置Java环境

查看是否已安装Java java -version 查看yum能下载的Java版本 yum -y list java*这里选择安装Java 11 yum install -y java-11-openjdk.x86_64查看是否安装成功并配置到环境里 java -version结束

linux系统安全与应用【下】

目录 1.开关机安全控制 1.1GRUB限制 2.终端登录安全控制 2.1 限制root只在安全终端登录 2.2 禁止普通用户登录 3.弱口令检测 3.1 Joth the Ripper&#xff08;JR&#xff09; 4.网络端口扫描 4.1 nmap命令 1.开关机安全控制 1.1GRUB限制 通常情况下在系统开机进入GRU…

在Mac M1笔记本上跑大语言模型llama3的4个步骤?(install、pull、run、ask)

要点 Ollama一个功能强大的本地大语言模型LLM运行工具&#xff0c;支持很多模型&#xff0c;并且操作极其简单快速回忆步骤&#xff1a; 下载ollama工具&#xff1a;https://ollama.com/download 下载模型&#xff1a;ollama pull llama3 #根据libs列表直接指定名字 运行模型…

uni-app app和h5的通信

uni-app一套代码同时打包安卓、iOS、h5,有一些需要app与h5的交互通信,目前做到了这块的业务,记录如下&#xff1a; 1.去declould官网,找到uni_webview.js下载链接,将uni_webview.js文件下载到本地&#xff0c;修改uni_webview.js内部配置,将uni修改为webUni,修改好的文件已放到…