Leetcode: Trapping Rain Water II
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevation map, compute the volume of water it is able to trap after raining. Note:
Both m and n are less than 110. The height of each unit cell is greater than 0 and is less than 20,000. Example: Given the following 3x6 height map:
[
[1,4,3,1,3,2],
[3,2,1,3,2,4],
[2,3,3,2,3,1]
] Return 4.

The above image represents the elevation map [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] before the rain.

After the rain, water are trapped between the blocks. The total volume of water trapped is 4.
Refer to https://discuss.leetcode.com/topic/60418/java-solution-using-priorityqueue/2
这里有具体的例子:http://www.cnblogs.com/grandyang/p/5928987.html
Analysis, 根据木桶原理,先找外围最矮的bar,里边如果有bar比它还矮,一定能存水(因为四周所有的bar都比它高)
注意还可能存更多的水,因为往里面,很可能cell高度变化。所以要把BFS中间遇到的高的bar都存进queue,随着水平面提升,提升到这些bar的高度,看能不能有凹槽存更多的水
44-45行逻辑就是
if (height[row][col] < cur) {
res += cur.height- height[row][col];
queue.offer(new Cell(row, col, cur.height));
}
else {
queue.offer(new Cell(row, col, height[row][col]));
}
public class Solution {
public class Cell {
int row;
int col;
int height;
public Cell(int x, int y, int val) {
this.row = x;
this.col = y;
this.height = val;
}
}
public int trapRainWater(int[][] heightMap) {
if (heightMap==null || heightMap.length<=2 || heightMap[0].length<=2) return 0;
int m = heightMap.length;
int n = heightMap[0].length;
int res = 0;
PriorityQueue<Cell> queue = new PriorityQueue<Cell>(1, new Comparator<Cell>() {
public int compare(Cell c1, Cell c2) {
return c1.height - c2.height;
}
});
HashSet<Integer> visited = new HashSet<Integer>();
for (int i=0; i<m; i++) {
queue.offer(new Cell(i, 0, heightMap[i][0]));
queue.offer(new Cell(i, n-1, heightMap[i][n-1]));
visited.add(i*n+0);
visited.add(i*n+n-1);
}
for (int j=0; j<n; j++) {
queue.offer(new Cell(0, j, heightMap[0][j]));
queue.offer(new Cell(m-1, j, heightMap[m-1][j]));
visited.add(0*n+j);
visited.add((m-1)*n+j);
}
int[][] directions = new int[][]{{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
while (!queue.isEmpty()) {
Cell cur = queue.poll();
for (int[] dir : directions) {
int row = cur.row + dir[0];
int col = cur.col + dir[1];
if (row>=0 && row<m && col>=0 && col<n && !visited.contains(row*n+col)) {
visited.add(row*n+col);
res += Math.max(0, cur.height - heightMap[row][col]);
queue.offer(new Cell(row, col, Math.max(cur.height, heightMap[row][col])));
}
}
}
return res;
}
}
Leetcode: Trapping Rain Water II的更多相关文章
- [LeetCode] Trapping Rain Water II 收集雨水之二
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- [LeetCode] Trapping Rain Water II 题解
题意 题目 思路 我一开始想的时候只考虑到一个结点周围的边界的情况,并没有考虑到边界的高度其实影响到所有的结点盛水的高度. 我们可以发现,中间是否能够盛水取决于边界是否足够高于里面的高度,所以这必然是 ...
- leetcode 11. Container With Most Water 、42. Trapping Rain Water 、238. Product of Array Except Self 、407. Trapping Rain Water II
11. Container With Most Water https://www.cnblogs.com/grandyang/p/4455109.html 用双指针向中间滑动,较小的高度就作为当前情 ...
- [LeetCode] Trapping Rain Water 收集雨水
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- [LeetCode] 407. Trapping Rain Water II 收集雨水之二
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- [LeetCode] 407. Trapping Rain Water II 收集雨水 II
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- LeetCode: Trapping Rain Water 解题报告
https://oj.leetcode.com/problems/trapping-rain-water/ Trapping Rain WaterGiven n non-negative intege ...
- [Swift]LeetCode407. 接雨水 II | Trapping Rain Water II
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- [leetcode]Trapping Rain Water @ Python
原题地址:https://oj.leetcode.com/problems/trapping-rain-water/ 题意: Given n non-negative integers represe ...
随机推荐
- Gender, Genre, and Writing Style in Formal Written Texts
http://u.cs.biu.ac.il/~koppel/papers/male-female-text-final.pdf Abstract. This paper explores di ...
- 256 terabytes random-access memory
Computer Systems A Programmer's Perspective Second Edition As we will discuss, the extension of IA32 ...
- 关于Java的File.separator
在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...
- 分页查询:使用分页类查询 用get传值
<body> <?php $cx = ""; if(!empty($_GET["cx"])) //判断get传过来的值非空,那么把传过来的值赋 ...
- cordova插件iOS平台实战开发注意点
cordova插件是其设计理念的精髓部分,创建并使用自定义插件也是一件比较容易的事.但在这个过程中也容易进入一些误区或者有一些错误的理解,下面从笔者实际开发中遇到的问题出发,对其中的一些注意点和重要概 ...
- Android 环境快速搭建-详细步骤-win7-64bit
电脑装了win7 64位的系统,重新来搭建了安卓环境,发现有一种非常便捷,快速的方法就可以搭建起来了~ 步骤一:下载java sdk 进入http://www.oracle.com/us/sun/in ...
- SQL Server存储机制二
http://blog.csdn.net/ltylove2007/article/details/21084585 http://www.cnblogs.com/anding/p/3254674.ht ...
- BAT for循环
一,数字循环 echo off & color 0A for /l %%i in (1,1,10) do ( echo %%i ) pause > nul 输出: 1 2 3 4 5 6 ...
- C#访问url地址并返回数据
public partial class Form1 : Form { static bool isSelect = false; public Form1() { InitializeCompone ...
- ArcGIS API for JavaScript开发环境搭建及第一个实例demo
原文:ArcGIS API for JavaScript开发环境搭建及第一个实例demo ESRI公司截止到目前已经发布了最新的ArcGIS Server for JavaScript API v3. ...