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。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.Comparator;
import java.util.Map;
import java.util.PriorityQueue;
class Solution {
private int[] dx = {0, 1, 0, -1};
private int[] dy = {1, 0, -1, 0};
public int trapRainWater(int[][] heightMap) {
if (heightMap == null || heightMap.length == 0 || heightMap[0].length == 0) {
return 0;
}
int ans = 0;
PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(heightMap[o1[0]][o1[1]], heightMap[o2[0]][o2[1]]);
}
});
int n = heightMap.length;
int m = heightMap[0].length;
boolean[][] visited = new boolean[n][m];
for (int i = 0; i < m - 1; ++i) {
queue.offer(new int[]{0, i});
visited[0][i] = true;
}
for (int i = 0; i < n - 1; ++i) {
queue.offer(new int[]{i, m - 1});
visited[i][m - 1] = true;
}
for (int i = m - 1; i > 0; --i) {
queue.offer(new int[]{n - 1, i});
visited[n - 1][i] = true;
}
for (int i = n - 1; i > 0; --i) {
queue.offer(new int[]{i, 0});
visited[i][0] = true;
}
int max = 0;
while (!queue.isEmpty()) {
int[] node = queue.poll();
max = Math.max(max, heightMap[node[0]][node[1]]);
for (int i = 0; i < 4; ++i) {
int x = dx[i] + node[0];
int y = dy[i] + node[1];
if (x >= 0 && x < n && y >= 0 && y < m && !visited[x][y]) {
ans += Math.max(0, max - heightMap[x][y]);
visited[x][y] = true;
queue.offer(new int[]{x, y});
}
}
}
return ans;
}
}
心之所向,素履以往 生如逆旅,一苇以航
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!