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

news/2024/9/23 2:34:21/

leetcode_407__II_3D_0">力扣(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.ppmy.cn/news/1431132.html

相关文章

Macs Fan Control Pro for Mac:全面优化Mac风扇控制软件

Macs Fan Control Pro for Mac是一款专为苹果电脑用户设计的风扇控制软件&#xff0c;旨在通过精确的风扇速度调节&#xff0c;全面优化Mac的散热性能&#xff0c;确保系统始终运行在最佳状态。 Macs Fan Control Pro for Mac中文版下载 该软件具备实时监控功能&#xff0c;能够…

【WSL报错】执行:wsl --list --online;错误:0x80072ee7

【WSL报错】执行:wsl --list --online&#xff1b;错误:0x80072ee7 问题情况解决方法详细过程 问题情况 C:\Users\17569>wsl --list --online 错误: 0x80072ee7 解决方法 开系统代理&#xff0c;到外网即可修复&#xff01;&#xff01;&#xff01;&#xff01;&#x…

掌控基础设施,加速 DevOps 之旅:IaC 深度解析

在当今的 DevOps 世界中&#xff0c;基础设施即代码&#xff08;IaC&#xff09;是一个非常重要的概念。它在整个行业几乎无处不在&#xff0c;是现代工程角色的绝对关键。 本文将主要包含 IaC 的定义和它的好处&#xff0c;同时将 Walrus 作为最佳实践来进行详细讲解。 什么是…

【RAG 论文】WikiChat:从 WikiPedia 检索数据来提高 LLM 的事实性的聊天机器人

论文&#xff1a;WikiChat: Stopping the Hallucination of Large Language Model Chatbots by Few-Shot Grounding on Wikipedia ⭐⭐⭐⭐ Stanford University, EMNLP 2023 相关地址&#xff1a; demo 体验地址CodeHuggingface 模型 文章目录 论文速读模型 demo一些其他的细节…

Linux常用命令简单介绍(面试常考!!!)

文件 ls (list files) : 列出当前目录下的的目录和文件chown (change owner) &#xff1a; 修改所属用户&#xff0c;也可以同时更改文件所属组chmod (change mode) &#xff1a; 修改用户的权限。chgrp (change group) : 修改所属组cp&#xff08;copy file&#xff09;:…

C语言 流文件

抽象化的IO操作被封装&#xff0c;流 printf和scanf借助于标准输入和输出流stdin,stdout特殊的由C标准库管理的文件流 带用户态缓冲区的文件流&#xff0c;流也可以不带缓冲区。 输入流缓冲区只要有就可以读&#xff0c;不能刷新&#xff08;未定义行为&#xff09;。输出流…

SQLite的DBSTAT 虚拟表(三十六)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite运行时可加载扩展(三十五&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 1. 概述 DBSTAT 虚拟表是一个只读的同名虚拟表&#xff0c;返回 有关用于存储内容的磁盘空间量的信息 的 SQLite 数据库。 示例用例…

读天才与算法:人脑与AI的数学思维笔记07_数字绘画

1. 数字绘画 1.1. 事物的可预测性与不可预测性构成了我们熟识的世界 1.1.1. 汤姆斯托帕德&#xff08;Tom Stoppard&#xff09; 1.2. 艺术作品就是通过各种形式给人带来美的感受&#xff0c;从而使人们获得精神上的愉悦与放松 1.3. …