leetcode-407:接雨水 II

简介: leetcode-407:接雨水 II

题目

题目连接

给你一个 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

解题

动态规划(此方法在三维中没法用)

很快就想到将动态规划的方法从二维的接雨水引申到三维的接雨水中,但是存在侧漏的情况,如果仅仅只是求4个方向最高是不行的。

比如一个三维图的左视图和主视图都是这个样子,那么中心那个柱子,可以放3格水吗?显然会发生侧漏

class Solution {
public:
    inline int minH(int a,int b,int c,int d){
        return min(min(a,b),min(c,d));
    }
    int trapRainWater(vector<vector<int>>& heightMap) {
        int m=heightMap.size(),n=heightMap[0].size();
        vector<vector<int>> heightW(m,vector<int>(n,0));
        vector<vector<int>> heightS(m,vector<int>(n,0));
        vector<vector<int>> heightA(m,vector<int>(n,0));
        vector<vector<int>> heightD(m,vector<int>(n,0));
        for(int j=0;j<n;j++) heightW[0][j]=heightMap[0][j];
        for(int i=1;i<m;i++){
            for(int j=0;j<n;j++){
                heightW[i][j]=max(heightW[i-1][j],heightMap[i][j]);
            }
        }
        for(int j=0;j<n;j++) heightS[m-1][j]=heightMap[m-1][j];
        for(int i=m-2;i>=0;i--){
            for(int j=0;j<n;j++){
                heightS[i][j]=max(heightS[i+1][j],heightMap[i][j]);
            }
        }
        for(int i=0;i<m;i++) heightA[i][0]=heightMap[i][0];
        for(int j=1;j<n;j++){
            for(int i=0;i<m;i++){
                heightA[i][j]=max(heightA[i][j-1],heightMap[i][j]);
            }
        }
        for(int i=0;i<m;i++) heightD[i][n-1]=heightMap[i][n-1];
        for(int j=n-2;j>=0;j--){
            for(int i=0;i<m;i++){
                heightD[i][j]=max(heightD[i][j+1],heightMap[i][j]);
            }
        }
        int res=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                res+=minH(heightA[i][j],heightD[i][j],heightW[i][j],heightS[i][j])-heightMap[i][j];
            }
        }
        return res;   
    }
};

方法一:优先队列

核心思想就是先确定木桶的外围,找到外围的最短板子后对其周围能填水的地方填水,然后更新木桶外围

根据木桶原理,接到的雨水由容器周围最短的木板决定的,开始取决于最外圈

通过优先队列,每次可以取到最短的木板

将3填充成了水,变成4,可以把它当作成新的容器的外圈,这样一步步迭代

class Solution {
public:
    int trapRainWater(vector<vector<int>>& heightMap) {
        int m=heightMap.size(),n=heightMap[0].size();
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
        vector<vector<bool>> visited(m,vector<bool>(n,false));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i==0||i==m-1||j==0||j==n-1){
                    q.emplace(heightMap[i][j],i*n+j);
                    visited[i][j]=true;
                }
            }
        }
        int dirs[5]={-1,0,1,0,-1};
        int res=0;
        while(!q.empty()){
            auto [h,index]=q.top();
            q.pop();
            for(int i=0;i<4;i++){
                int nx=index/n+dirs[i];
                int ny=index%n+dirs[i+1];
                if(nx<0||nx>=m||ny<0||ny>=n||visited[nx][ny]) continue;
                if(heightMap[nx][ny]<h){
                    res+=h-heightMap[nx][ny];
                }
                visited[nx][ny]=true;
                q.emplace(max(heightMap[nx][ny],h),nx*n+ny);
            }
        }
        return res;
    }
};

方法二:并查集

相关文章
|
算法 计算机视觉 开发者
|
安全 物联网 5G
5g技术的优缺点是什么
5g技术的优缺点是什么
1584 0
|
网络协议 Linux 开发工具
开发指南 | OpenWrt免费内嵌花生壳PHTunnel实现内网穿透
本文将详解如何把花生壳PHTunnel封装成一个OpenWrt标准组件,并编译到自己的OpenWrt固件中,实现内网穿透功能。
开发指南 | OpenWrt免费内嵌花生壳PHTunnel实现内网穿透
|
弹性计算 Linux 测试技术
阿里云ECS网络不稳定、访问丢包、延迟高怎么办?
若ECS服务器经常出现网络不稳定、延迟高等情况,针对不同情况,下面列出一些常用的解决方法供大家参考: 一、Linux实例 可以尝试先用如winmtr之类的工具,查看是服务端的丢包还是网际路由线路的丢包。
|
安全 数据安全/隐私保护
BUUCTF---wireshark1
BUUCTF---wireshark1
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
|
机器人 芯片
ChatGPT提问技巧——对话提示
ChatGPT提问技巧——对话提示
1222 8
|
机器学习/深度学习 人工智能 运维
智能化运维:AI技术在IT管理中的创新应用
本文将探讨如何运用人工智能技术优化IT运维流程,提升效率并减少人为错误。我们将从智能监控、自动化响应到预测性维护等方面,分析AI在现代IT运维中的角色和价值。文章旨在为读者提供一种全新的视角,理解AI技术如何成为IT部门的强大盟友,并指出实施这些技术时可能遇到的挑战及应对策略。
|
敏捷开发 监控 IDE
深入理解自动化测试工具Selenium的工作原理与实践应用
【5月更文挑战第26天】 随着敏捷开发和持续集成理念的普及,自动化测试在软件开发生命周期中扮演了至关重要的角色。Selenium作为最流行的自动化测试工具之一,以其开源、跨平台和支持多种编程语言的特性被广泛使用。本文将详细解析Selenium的核心组件,探讨其工作原理,并通过案例分析展示如何高效地实施Selenium进行Web应用的自动化测试。我们将从测试准备到结果分析的全过程,提供一系列实用的策略和最佳实践,帮助读者构建和维护一个健壮的自动化测试环境。
|
机器学习/深度学习 算法 网络架构
**深度学习中的梯度消失与爆炸影响模型训练。梯度消失导致输入层参数更新缓慢,梯度爆炸使训练不稳。
【6月更文挑战第28天】**深度学习中的梯度消失与爆炸影响模型训练。梯度消失导致输入层参数更新缓慢,梯度爆炸使训练不稳。解决办法包括:换激活函数(如ReLU)、权重初始化、残差连接、批量归一化(BN)来对抗消失;梯度裁剪、权重约束、RMSProp或Adam优化器来防止爆炸。这些策略提升网络学习能力和收敛性。**
266 0

热门文章

最新文章