2021-11-03接雨水II
题目描述:
给你一个 m x n
的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。
例如:heightMap = [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 时表示的情形如下图,最多接到的雨水体积为4。
解法:
模拟雨水的流失,先将所有格子上都放上雨水,使得所有格子的“地基”加雨水的高度相同。(边缘一圈和地基最高的格子上不放雨水)
然后多次遍历中间的格子(除去边缘一圈的格子),如果这个格子(i, j)有雨水,并且其上下左右四个格子中有一个的总高度(地基+雨水)低于这个格子(i, j)的总高度,则减少格子(i, j)的雨水数,要么到0,要么总高度等于上面找到的最低的邻格总高度。
如果某次遍历没有发生雨水的变化,则遍历完成。统计剩下的雨水数即可。
代码如下:
public class Solution {// 获取 [ii][jj] 四周最高的高度public static int highest(int[][] heightMap, int m, int n){int max = heightMap[0][0];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if(heightMap[i][j] > max)max = heightMap[i][j];}}return max;}// 获取四个数中的最小值public static int min(int a, int b, int c, int d){int mini = a;if(b < mini)mini = b;if(c < mini)mini = c;if(d < mini)mini = d;return mini;}// 获取 [ii][jj] 四周包括雨水最低的高度public static int lowest(int[][] heightMap, int rain[][], int ii, int jj){int a = heightMap[ii-1][jj] + rain[ii-1][jj];int b = heightMap[ii+1][jj] + rain[ii+1][jj];int c = heightMap[ii][jj-1] + rain[ii][jj-1];int d = heightMap[ii][jj+1] + rain[ii][jj+1];return min(a, b, c, d);}public static void print_rain(int[][] rain, int m, int n){for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {System.out.printf("%d ", rain[i][j]);}System.out.println();}System.out.println();}public int trapRainWater(int[][] heightMap) {int m = heightMap.length;int n = heightMap[0].length;if(m <= 2 || n <= 2)return 0;// m > 2 and n > 2int[][] rain = new int[m][n];// 先尽可能多的装雨,元素值为雨水高度,不包括地基int max_height = highest(heightMap, m, n);for(int i=1; i<m-1; i++)for(int j=1; j<n-1; j++)rain[i][j] = max_height - heightMap[i][j];boolean changed;int temp;do{changed = false;for(int i=1; i<m-1; i++){for(int j=1; j<n-1; j++){if( rain[i][j] > 0 ){temp = lowest(heightMap, rain, i, j);if(temp < rain[i][j]+heightMap[i][j]){changed = true;if(heightMap[i][j] >= temp){rain[i][j] = 0;}else {rain[i][j] = temp - heightMap[i][j];}}}}}} while (changed);int ret = 0;for(int i=1; i<m-1; i++){for(int j=1; j<n-1; j++) {ret += rain[i][j];}}return ret;}
}
2021-11-03接雨水II相关推荐
- 【财经期刊FM-Radio|2021年03月01日】
title: [财经期刊FM-Radio|2021年03月01日] 微信公众号: 张良信息咨询服务工作室 [今日热点新闻一览↓↓] 2月份中国制造业PMI季节性回落,经济仍保持稳定恢复势头 茅台集团去 ...
- 【财经期刊FM-Radio|2021年03月04日】
title: [财经期刊FM-Radio|2021年03月04日] 微信公众号: 张良信息咨询服务工作室 [今日热点新闻一览↓↓] 科技股拖累纳指跌超2%,ARKK跌入熊市,美债收益率又猛升,美国5年 ...
- 【财经期刊FM-Radio|2021年03月29日】
title: [财经期刊FM-Radio|2021年03月29日] 微信公众号: 张良信息咨询服务工作室 [今日热点新闻一览↓↓] 北京时间周一亚洲早盘,美股期货和原油期货小幅走低. 低基数叠加&qu ...
- 【财经期刊FM-Radio|2021年03月03日】
title: [财经期刊FM-Radio|2021年03月03日] 微信公众号: 张良信息咨询服务工作室 [今日热点新闻一览↓↓] 科技股拖累美股回落,电动车股大跌,蔚来小鹏跌超10%,芯片股下挫,金 ...
- 2021/11/07-2021/11/11
# -*- coding = utf-8 -*- # @Time:2021/11/7 16:09 # @Author:zhangchuhan # @File:demo01.py # @Software ...
- 【Yolov5】1.认真总结6000字Yolov5保姆级教程(旧版本2021.08.03作为备份)
旧版本2021.08.03 新版本https://blog.csdn.net/m0_53392188/article/details/119334634 以作备份 目录 一.前言 二.学 ...
- 史上最详细微信小程序授权登录与后端SprIngBoot交互操作说明,附源代码,有疑惑大家可以直接留言,蟹蟹 2021.11.29完善更新小程序代码,
2021.11.29 更新文章 你好,我是博主宁在春,一起学习吧!!! 写这篇文章的原因,主要是因为最近在写毕业设计,用到了小程序,这中间曲曲折折,一言难尽啊.毕业设计真的让人麻脑阔
- 读论文——Pre-Training with Whole Word Masking for Chinese BERT(2021 11.25)
第一遍 标题以及作者(2021 11.25) 摘要 本文基于BERT,在RoBERTa上进行一系列改进,提出了用于中文的预训练模型MacBERT. 提出了一种新的掩码策略,MLM as correct ...
- 首页推荐流支持快捷修改兴趣标签,问答支持展示gif【2021.11.8】
hello,大家好,这里是「CSDN产品周报」第17期.本次更新主要涉及首页和问答两个产品模块,具体细节请往下看. 一.首页优化 1.「推荐」信息流新增「修改兴趣标签」按钮 从用户需求的角度考虑,对内 ...
- 【报告分享】小红书平台2021 11.11期间行业投放分析报告-千瓜数据(附下载)
摘要:随着平台多元化发展,用户体量增加,小红书逐渐拥抱了更多的年轻用户群体,也给更多的品牌带来了增长机会.据小红书方透露,2021年小红书平台的单日笔记曝光已经超100亿次,且男性用户占比已经达到了3 ...
最新文章
- ProgressDialog用法详解
- vary渲染图没了_云渲染哪个好用?云渲染平台对比
- anaconda怎么运行python程序-致Python初学者 Anaconda入门使用指南完整版
- 启明云端分享|直接用ESP32-S2和ESP32-C3驱动1.54寸串口屏,有哪些区别呢,他们的亮点又有哪些呢
- C++ 获取本机登陆过的QQ号码
- Android Retrofit 2.0 使用-补充篇
- libfetion的使用
- 会计学原理与财务报表分析
- 4G升级5G需要换手机还是换手机卡,还是都不用换?
- 手机无线访问计算机文件夹,电脑怎么通过无线wifi读取手机文件
- 左神算法基础class6—题目2宽度优先遍历和深度优先遍历
- 万丈高楼平地起,开始给Java打地基
- Android-小游戏
- 虚拟机可以做成存储服务器吗,利用win10自带虚拟机功能轻松打造家用nas
- xctf攻防世界 MISC高手进阶区 Banmabanma
- VSTO PPT图表对象的操作(2)
- 三维坐标点绕任意轴旋转的新坐标计算
- Web应用程序与桌面应用程序的区别
- 免费空间2015大主机免费的时代
- 计算机重启后无法连接网络,路由器重启后电脑无法联网怎么办?有什么解决方法...