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

news2024/9/28 9:25:19

力扣(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.coloradmin.cn/o/1615073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IEC104协议

1. 简介 IEC104规约是一个广泛应用于电力、城市轨道交通等行业的国际标准。 2. 术语解释 遥脉 (电度量)&#xff1a; 是指对现场某装置所发出的脉冲信号进行周期累计的一种远程计数操作。 其实&#xff0c;遥脉也可以看成是被具体规定了采用脉冲计数作为测量方法的一种遥测…

日本二次元团建国内院线:一周一部,占据36.2%票房

从《你想活出怎样的人生》开始&#xff0c;到《哈尔的移动城堡》结束&#xff0c;日本动画正在占据国内院线的整个4月份档期。 包括《数码宝贝02&#xff1a;最初的召唤》、《间谍过家家 代号&#xff1a;白》多部作品在内&#xff0c;整个国内四月份院线日本动画平均一周上映…

分布式锁(Redis)

一、序言 本文和大家聊聊分布式锁以及常见的解决方案。 二、什么是分布式锁 假设一个场景&#xff1a;一个库存服务部署在上面三台机器上&#xff0c;数据库里有 100 件库存&#xff0c;现有 300 个客户同时下单。并且这 300 个客户均摊到上面的三台机器上&#xff08;即三台…

4套java智慧型管理系统源码-智慧校园-智慧工地-智慧城管-智慧3D导诊

第一套&#xff1a;Java智慧校园系统源码 智慧学校源码 微信小程序电子班牌 智慧校园系统简介&#xff1a; 智慧校园的建设逐渐被师生、家长认可接受&#xff0c;智慧校园通过对在校师生、教务等所有人员的信息以及各种信息搜集与储存&#xff0c;进行数据优化与管理&#xf…

信息系统项目管理师0057:运维管理(4信息系统管理—4.2管理要点—4.2.2运维管理)

点击查看专栏目录 文章目录 4.2.2运维管理1.能力模型2.智能运维4.2.2运维管理 IT运维是组织IT服务中关键的一种类型。随着组织IT建设的不断深入和完善,信息系统运维已经成为了各行各业各组织管理者和IT团队普遍关注的问题。IT运维是指采用IT手段及方法,依据服务对象提出的服务…

代码学习记录49---单调栈

随想录日记part49 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.20 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;柱状图中最大的矩形 84.柱状图中最大的矩形 Topic184.柱状图中最大的矩形 题目&…

一线实战:国产数据库Mogdb双网卡同步最佳实践

前言 大家都知道Oracle数据库无论是单机还是RAC集群在进行生产部署实施时&#xff0c;我们都会对网卡做冗余考虑&#xff0c;使用双网卡&#xff0c;比如public、心跳网络。这样的目的主要是为了安全&#xff0c;避免单点故障。当然双网卡Bond不仅是可以做主备还可以支持负载均…

问题总结笔记

1.向量旋转 问题&#xff1a; 将一个向量旋转90 方法&#xff1a;旋转矩阵 FVector FrontDir EndMousePoint - Point; FrontDir.Normalize(); FVector Left FVector(-FrontDir.Y, FrontDir.X, 0); Verties.Add(Point Left * (WallWedith / 2)); Verties.Add(FVector(Vertie…

告别数据丢失,轻松掌握文件自动备份秘籍

在这个数字化高速发展的时代&#xff0c;我们的工作和生活都离不开电脑&#xff0c;而电脑中存储的文件和数据更是至关重要。然而&#xff0c;数据丢失的风险无处不在&#xff0c;可能因为硬件故障、软件崩溃、病毒攻击等原因而导致重要文件丢失。因此&#xff0c;文件自动备份…

漫谈HAMR硬盘的可靠性-2

很显然&#xff0c;HAMR已经成为业内用于提升HDD硬盘容量硬盘的技术手段。三家机械硬盘HDD厂商&#xff0c;希捷、西数、东芝都已对HAMR硬盘进行了十多年的研究&#xff0c;但只有希捷大胆押注HAMR。相反&#xff0c;东芝和西部数据在采用HAMR之前选择了能量辅助垂直磁记录&…

iOS 在OC旧项目中使用Swift进行混编

iOS 在OC旧项目中使用Swift进行混编 1、创建桥接文件 ​ 第一次在Swift创建OC文件&#xff0c;或者第一次OC创建Swift时&#xff0c;xcode会提示桥接&#xff0c;Creat Bridging Header即可,这个文件用于Swift调用OC文件&#xff0c;与OC调用Swift无关。 2、在TARGETS中设置D…

机器学习(三)之监督学习2

前言&#xff1a; 本专栏一直在更新机器学习的内容&#xff0c;欢迎点赞收藏哦&#xff01; 笔者水平有限&#xff0c;文中掺杂着自己的理解和感悟&#xff0c;如果有错误之处还请指出&#xff0c;可以在评论区一起探讨&#xff01; 1.支持向量机&#xff08;Support Vector Ma…

第22天:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用

第二十二天 一、PHP留言板前后端功能实现 开发环境&#xff1a; DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS开发 PHPStorm : 专业PHP开发IDE PhpStudy &#xff1a;Apache MYSQL环境 Navicat Premium: 全能数据库管理工具 二、数据库创建&架…

【Flutter】One or more plugins require a higher Android SDK version.

问题描述 项目里多个组件需要更高版本的Android SDK One or more plugins require a higher Android SDK version.解决方案&#xff1a; 报错提示requires Android SDK version 34 按提示修改android项目app里build.gradle的compileSdkVersion 为34 android {compileSdkVe…

线程池 ThreadPoolExecutor 参数详解

一、引言 提到 Java 线程池&#xff0c;就不得不说 ThreadPoolExecutor&#xff0c;它是 Java 并发包 java.util.concurrent 中的一个类&#xff0c;提供一个高效、稳定、灵活的线程池实现&#xff0c;用于实现多线程并发执行任务&#xff0c;提高应用程序的执行效率。 在《任…

JVM与GC原理

JVM运行流程 Java 虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是 Java 平台的核心组件之一&#xff0c;它是一个在实际硬件和操作系统上模拟运行 Java 字节码的虚拟计算机 Java 程序被执行的顺序通常包括以下几个步骤&#xff1a; 编辑&#xff08;E…

Midjourney 中文文档

快速使用 学习如何在Discord上使用Midjourney Bot从简单的文本提示中创建自定义图像。 行为准则 不要表现出不良行为。不要使用我们的工具制作可能引起煽动&#xff0c;不安或引起争议的图像。这包括血腥和成人内容。尊重其他人和团队。 1&#xff1a;加入Discord 访问Midj…

如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 - 第507篇

历史文章 AI音乐&#xff0c;8大变现方式——Suno&#xff1a;音乐版的ChatGPT - 第505篇 日赚800&#xff0c;利用淘宝/闲鱼进行AI音乐售卖实操 - 第506篇 导读 在使用AI生成音乐&#xff08;AI写歌&#xff09;的时候&#xff0c;你是不是有这样的困惑&#xff1a; &…

Docker 部署网页版 vscode (code-server)

什么是 code-server code-server 是一个基于 Visual Studio Code 的开源项目&#xff0c;它允许你通过 Web 浏览器来使用 Visual Studio Code 的编辑功能。这意味着你可以在任何设备上&#xff0c;只要有浏览器和网络连接&#xff0c;就可以访问和使用 Visual Studio Code&…

如果备份了oradata文件,该如何还原Oracle数据呢?

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…